# Message Center
Implement Message Center to provide an inbox for rich HTML-based messages.
# Get started with Message Center on React Native
> The default Message Center is available for React Native with minimal integration required. Basic theming options are supported.
Message Center provides an inbox for rich, HTML-based messages. Learn more about Message Center in our [feature guide](https://www.airship.com/docs/guides/features/messaging/message-center/).
## Display the Message Center
Display the Message Center with a single method call:
```ts
await Airship.messageCenter.display();
```
To customize the Message Center UI or navigation, see [Embedding the Message Center](https://www.airship.com/docs/developer/sdk-integration/react-native/message-center/embedding/).
## Fetch Messages
Retrieve messages from the inbox:
```ts
const messages = await Airship.messageCenter.getMessages();
```
## Listen for Message Updates
Subscribe to message updates using event listeners:
```ts
Airship.addListener(EventType.MessageCenterUpdated, () => {
// Update your UI
Airship.messageCenter.getMessages().then((messages) => {
// Handle messages
});
});
```
## Listen for Unread Count Changes
Subscribe to unread count updates:
```ts
const unreadCount = await Airship.messageCenter.getUnreadCount();
// Update badge or UI
```
## Refresh Messages
Manually refresh the message list from the server:
```ts
try {
await Airship.messageCenter.refreshMessages();
} catch (error) {
console.log('Unable to refresh inbox: ', error);
}
```
## Mark Messages as Read
Mark one or more messages as read:
```ts
try {
await Airship.messageCenter.markMessageRead('message-id');
} catch (error) {
console.log('Unable to mark message as read: ', error);
}
```
## Delete Messages
Delete one or more messages:
```ts
try {
await Airship.messageCenter.deleteMessage('message-id');
} catch (error) {
console.log('Unable to delete message: ', error);
}
```
# Embed the Message Center
> Airship's SDK provides a simple interface for managing the Message Center within your application.
This guide covers creating custom Message Center implementations for React Native applications.
## Override Default Display Behavior
To use a custom Message Center implementation instead of the default UI, disable auto-launch and add a listener to handle display events:
```ts
// Disable the default UI
Airship.messageCenter.setAutoLaunchDefaultMessageCenter(false);
// Add a listener to handle display events
Airship.addListener(EventType.DisplayMessageCenter, (event) => {
if (event.messageId) {
// Navigate to specific message
} else {
// Navigate to message center
}
});
```
## Custom Message Center Implementation
For complete control over Message Center placement and navigation, create a custom implementation using the Message Center components.
### Using the MessageView
The `MessageView` component can be used to display individual messages:
```ts
```
### Example: Custom Message Center Inbox
Here's an example of a complete Message Center inbox implementation:
```ts
import * as React from 'react';
import {
Text,
View,
FlatList,
TouchableHighlight,
RefreshControl,
} from 'react-native';
import Moment from 'moment';
import Airship, { Subscription, EventType, InboxMessage } from '@ua/react-native-airship';
interface MessageCenterScreenProps {
navigation: any;
}
function Item({ message, navigation }: { message: any; navigation: any }) {
return (
navigation.navigate('MessageDetails', {
messageId: message.id,
title: message.title,
})
}
>
{message.title}
{Moment(message.sentDate).format('MM/DD/YYYY')}
);
}
export default class MessageCenterScreen extends React.Component<
MessageCenterScreenProps,
{
messages: InboxMessage[];
refreshing: boolean;
}
> {
private updateSubscription?: Subscription;
constructor(props: MessageCenterScreenProps) {
super(props);
this.state = {
messages: [],
refreshing: true,
};
this.refreshMessageCenter = this.refreshMessageCenter.bind(this);
this.handleUpdateMessageList = this.handleUpdateMessageList.bind(this);
}
componentDidMount(): void {
this.updateSubscription = Airship.addListener(
EventType.MessageCenterUpdated,
this.handleUpdateMessageList
);
this.handleUpdateMessageList();
}
componentWillUnmount(): void {
this.updateSubscription?.remove();
}
handleUpdateMessageList() {
Airship.messageCenter.getMessages().then((data) => {
this.setState({
messages: data,
refreshing: false,
});
});
}
refreshMessageCenter() {
Airship.messageCenter
.refreshMessages()
.then(() => {
this.setState({
refreshing: false,
});
})
.catch((error) => {
console.log('failed to refresh', error);
});
}
render() {
return (
(
)}
keyExtractor={(item) => item.id}
refreshControl={
}
/>
);
}
}
```
### Example: Message Detail Screen
Here's an example of a message detail screen:
```ts
import * as React from 'react';
import { View, ActivityIndicator, Alert } from 'react-native';
import { MessageView } from '@ua/react-native-airship';
interface MessageScreenProps {
navigation: any;
route: any;
}
export default class MessageScreen extends React.Component<
MessageScreenProps,
{
animating: boolean;
}
> {
constructor(props: MessageScreenProps) {
super(props);
this.state = {
animating: true,
};
this.startLoading = this.startLoading.bind(this);
this.finishLoading = this.finishLoading.bind(this);
this.failedLoading = this.failedLoading.bind(this);
}
startLoading() {
this.setState({ animating: true });
}
finishLoading() {
this.setState({ animating: false });
}
failedLoading() {
this.setState({ animating: false });
Alert.alert('Error', 'Unable to load message. Please try again later', [
{ text: 'OK', onPress: () => this.props.navigation.goBack() },
]);
}
render() {
const { params } = this.props.route;
const messageId = params ? params.messageId : '';
return (
{this.state.animating && (
)}
);
}
}
```
For more examples, see our [sample app](https://github.com/urbanairship/react-native-module/tree/main/example).