---
id: custom_main_views
title: Custom views
sidebar_label: Custom views
---
If you need to develop a custom view that does not map directly to a Firestore
collection you can implement it as a React component.
You need to define the name, route and the component, and add it to the main
navigation, as the example below.
By default, it will show in the main navigation view.
For custom views you can define the following props:
* `path` string | string[]
CMS Path (or paths) you can reach this view from.
If you include multiple paths, only the first one will be included in the
main menu
* `name`: string
Name of this view
* `description`?: string
Optional description of this view. You can use Markdown
* `hideFromNavigation`?: boolean
Should this view be hidden from the main navigation panel.
It will still be accessible if you reach the specified path
* `view`: React.ReactNode
Component to be rendered
* `group`?: string
Optional field used to group top level navigation entries under a
navigation view.
A quick example for a custom view:
```tsx
export default function App() {
const productSchema = buildSchema({
name: "Product",
properties: {
name: {
title: "Name",
validation: { required: true },
dataType: "string"
}
}
});
const customViews: CMSView[] = [{
path: ["additional", "additional/:id"],
name: "Additional view",
description: "This is an example of an additional view that is defined by the user",
view:
}];
const navigation: NavigationBuilder = ({ user }: NavigationBuilderProps) => ({
collections: [
buildCollection({
relativePath: "products",
schema: productSchema,
name: "Products"
})
]
});
return ;
}
```
Your custom view is implemented as any regular React component that uses
some hooks provided by the CMS:
```tsx
import React from "react";
import { Box, Button } from "@material-ui/core";
import {
buildSchema,
useAuthController,
useSideEntityController,
useSnackbarController
} from "@camberi/firecms";
/**
* Sample CMS view not bound to a collection, customizable by the developer
* @constructor
*/
export function ExampleCMSView() {
// hook to display custom snackbars
const snackbarController = useSnackbarController();
// hook to open the side dialog that shows the entity forms
const sideEntityController = useSideEntityController();
// hook to do operations related to authentication
const authController = useAuthContext();
const customProductSchema = buildSchema({
name: "Custom product",
properties: {
name: {
title: "Name",
validation: { required: true },
dataType: "string"
},
very_custom_field: {
title: "Very custom field",
dataType: "string"
}
}
});
return (
This is an example of an additional view
{authController.loggedUser ?
Logged in
as {authController.loggedUser.displayName}