or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

android-imperative-api.mdcomponent-api.mdevent-system.mdindex.md

event-system.mddocs/

0

# Event System

1

2

Comprehensive event handling system providing detailed information about user interactions, including timestamps, timezone offsets, and event types.

3

4

## Capabilities

5

6

### DateTimePickerEvent

7

8

Main event object passed to onChange handlers containing event type and native event data.

9

10

```typescript { .api }

11

/**

12

* Event object passed to onChange handlers

13

*/

14

type DateTimePickerEvent = {

15

/** Type of event that occurred */

16

type: EvtTypes;

17

/** Native event data with timestamp and timezone information */

18

nativeEvent: {

19

/** Unix timestamp in milliseconds */

20

timestamp: number;

21

/** Timezone offset in minutes from UTC */

22

utcOffset: number;

23

};

24

};

25

```

26

27

### Event Types

28

29

Enumeration of possible event types from picker interactions.

30

31

```typescript { .api }

32

/**

33

* Possible event types from date/time picker interactions

34

*/

35

type EvtTypes = 'set' | 'neutralButtonPressed' | 'dismissed';

36

```

37

38

**Event Type Descriptions:**

39

- `'set'` - User selected a date/time and confirmed (positive button pressed)

40

- `'dismissed'` - Dialog was dismissed without selection (negative button, back button, or tap outside)

41

- `'neutralButtonPressed'` - Neutral button was pressed (typically "Clear" button on Android)

42

43

### Event Creator Functions

44

45

Utility functions for creating standardized event parameters. These are primarily used internally but are exported for custom event handling.

46

47

```typescript { .api }

48

/**

49

* Creates event parameters for date/time set events

50

* @param date - The selected date

51

* @param utcOffset - Timezone offset in minutes from UTC

52

* @returns Tuple of [event, date] for onChange handler

53

*/

54

function createDateTimeSetEvtParams(

55

date: Date,

56

utcOffset: number

57

): [DateTimePickerEvent, Date];

58

59

/**

60

* Creates event parameters for dismiss events

61

* @param date - The original date value

62

* @param utcOffset - Timezone offset in minutes from UTC

63

* @returns Tuple of [event, date] for onChange handler

64

*/

65

function createDismissEvtParams(

66

date: Date,

67

utcOffset: number

68

): [DateTimePickerEvent, Date];

69

70

/**

71

* Creates event parameters for neutral button events

72

* @param date - The original date value

73

* @param utcOffset - Timezone offset in minutes from UTC

74

* @returns Tuple of [event, date] for onChange handler

75

*/

76

function createNeutralEvtParams(

77

date: Date,

78

utcOffset: number

79

): [DateTimePickerEvent, Date];

80

```

81

82

**Usage Examples:**

83

84

```typescript

85

import {

86

createDateTimeSetEvtParams,

87

createDismissEvtParams,

88

createNeutralEvtParams

89

} from "@react-native-community/datetimepicker";

90

91

// Creating custom events (typically for testing or advanced use cases)

92

const selectedDate = new Date('2023-12-25');

93

const timezoneOffset = -480; // PST offset in minutes

94

95

// Create a "set" event

96

const [setEvent, setDate] = createDateTimeSetEvtParams(selectedDate, timezoneOffset);

97

console.log(setEvent.type); // 'set'

98

console.log(setEvent.nativeEvent.timestamp); // 1703462400000

99

console.log(setEvent.nativeEvent.utcOffset); // -480

100

101

// Create a "dismissed" event

102

const [dismissEvent, dismissDate] = createDismissEvtParams(selectedDate, timezoneOffset);

103

console.log(dismissEvent.type); // 'dismissed'

104

105

// Create a "neutral button" event

106

const [neutralEvent, neutralDate] = createNeutralEvtParams(selectedDate, timezoneOffset);

107

console.log(neutralEvent.type); // 'neutralButtonPressed'

108

```

109

110

### onChange Handler Pattern

111

112

The onChange callback follows a consistent pattern across all platforms and usage modes.

113

114

```typescript { .api }

115

/**

116

* Standard onChange handler signature

117

* @param event - Event object with type and native event data

118

* @param date - Selected date (undefined for dismiss events)

119

*/

120

type OnChangeHandler = (event: DateTimePickerEvent, date?: Date) => void;

121

```

122

123

**Complete onChange Implementation:**

124

125

```typescript

126

import React, { useState } from "react";

127

import DateTimePicker from "@react-native-community/datetimepicker";

128

129

function DatePickerWithEventHandling() {

130

const [date, setDate] = useState(new Date());

131

const [lastEventInfo, setLastEventInfo] = useState(null);

132

133

const handleDateChange = (event: DateTimePickerEvent, selectedDate?: Date) => {

134

// Log event details

135

console.log('Event type:', event.type);

136

console.log('Timestamp:', event.nativeEvent.timestamp);

137

console.log('UTC Offset:', event.nativeEvent.utcOffset);

138

console.log('Selected date:', selectedDate);

139

140

// Store event info for display

141

setLastEventInfo({

142

type: event.type,

143

timestamp: new Date(event.nativeEvent.timestamp),

144

utcOffset: event.nativeEvent.utcOffset,

145

selectedDate: selectedDate

146

});

147

148

// Handle different event types

149

switch (event.type) {

150

case 'set':

151

if (selectedDate) {

152

setDate(selectedDate);

153

console.log('Date updated to:', selectedDate.toISOString());

154

}

155

break;

156

157

case 'dismissed':

158

console.log('Picker dismissed without selection');

159

// Optionally hide picker or show message

160

break;

161

162

case 'neutralButtonPressed':

163

console.log('Clear/neutral button pressed');

164

// Optionally clear the date or show default

165

setDate(new Date()); // Reset to today

166

break;

167

}

168

};

169

170

return (

171

<DateTimePicker

172

value={date}

173

mode="date"

174

display="default"

175

onChange={handleDateChange}

176

/>

177

);

178

}

179

```

180

181

### Timezone Handling

182

183

The event system provides timezone information in the `utcOffset` field.

184

185

```typescript

186

const handleDateChange = (event: DateTimePickerEvent, selectedDate?: Date) => {

187

const { timestamp, utcOffset } = event.nativeEvent;

188

189

// Convert timestamp to Date object

190

const eventDate = new Date(timestamp);

191

192

// Calculate timezone information

193

const offsetHours = Math.abs(utcOffset) / 60;

194

const offsetDirection = utcOffset < 0 ? '-' : '+';

195

const timezoneString = `UTC${offsetDirection}${offsetHours}`;

196

197

console.log(`Event occurred at ${eventDate.toISOString()} (${timezoneString})`);

198

199

// Handle timezone-aware date processing

200

if (selectedDate) {

201

// The selectedDate is already in the local timezone

202

console.log('Local time:', selectedDate.toLocaleString());

203

console.log('UTC time:', selectedDate.toISOString());

204

}

205

};

206

```

207

208

### Error Event Handling (Android Only)

209

210

Android implementations support an additional `onError` callback for handling native errors.

211

212

```typescript { .api }

213

/**

214

* Error handler for Android native errors

215

* @param error - Error object from native Android code

216

*/

217

type OnErrorHandler = (error: Error) => void;

218

```

219

220

**Usage Example:**

221

222

```typescript

223

import { DateTimePickerAndroid } from "@react-native-community/datetimepicker";

224

225

DateTimePickerAndroid.open({

226

value: new Date(),

227

onChange: (event, date) => {

228

// Handle normal events

229

},

230

onError: (error) => {

231

console.error('Native Android error:', error.message);

232

233

// Common error scenarios:

234

switch (error.message) {

235

case 'Activity is null':

236

console.log('App is in background or activity destroyed');

237

break;

238

case 'Dialog already showing':

239

console.log('Another picker dialog is already open');

240

break;

241

default:

242

console.log('Unexpected error:', error);

243

}

244

},

245

});

246

```

247

248

### Platform-Specific Event Behavior

249

250

Different platforms may have slightly different event patterns:

251

252

**iOS:**

253

- Events fire immediately when user interacts with the picker

254

- `dismissed` events are less common (typically only on modal dismissal)

255

- Continuous updates during scrolling in spinner mode

256

257

**Android:**

258

- Events fire when dialog is dismissed (either confirmed or cancelled)

259

- Always includes `dismissed` event when cancelled

260

- `neutralButtonPressed` available for custom neutral buttons (not in Material 3)

261

262

**Windows:**

263

- Events similar to iOS with immediate feedback

264

- Limited event types (primarily `set` and `dismissed`)

265

266

```typescript

267

import { Platform } from 'react-native';

268

269

const handleDateChange = (event: DateTimePickerEvent, selectedDate?: Date) => {

270

if (Platform.OS === 'ios') {

271

// iOS may fire multiple events during interaction

272

if (event.type === 'set') {

273

// Update UI immediately

274

setDate(selectedDate);

275

}

276

} else if (Platform.OS === 'android') {

277

// Android fires single event when dialog closes

278

switch (event.type) {

279

case 'set':

280

setDate(selectedDate);

281

hideAndroidPicker();

282

break;

283

case 'dismissed':

284

hideAndroidPicker();

285

break;

286

}

287

}

288

};

289

```