Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
yarn add @bluebase/plugin-launcher @bluebase/plugin-material-ui @bluebase/plugin-react-native-paper @bluebase/plugin-responsive-grid @bluebase/plugin-vector-icons @bluebase/plugin-settings-app @bluebase/plugin-react-router @bluebase/plugin-react-navigation @bluebase/plugin-responsive-grid @bluebase/plugin-json-schema-componentsexpo install react-native-safe-area-context react-native-gesture-handler react-native-reanimatedimport BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginMaterialUI from '@bluebase/plugin-material-ui';
import BlueBasePluginReactRouter from '@bluebase/plugin-react-router';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
export const plugins = [
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginMaterialUI,
BlueBasePluginReactRouter,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
BlueBasePluginSettingsApp,
];import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginReactNativePaper from '@bluebase/plugin-react-native-paper';
import BlueBasePluginReactNavigation from '@bluebase/plugin-react-navigation';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
export const plugins = [
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginReactNativePaper,
BlueBasePluginReactNavigation,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
BlueBasePluginSettingsApp,
];import 'react-native-gesture-handler';
import React from 'react';
import { BlueBaseApp } from '@bluebase/core';
import { plugins } from './plugins';
export default function App() {
return (
<BlueBaseApp plugins={plugins} />
);
}module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: ['react-native-reanimated/plugin'],
};
};expo start



import { DynamicIcon, View } from '@bluebase/components';
import { useStyles, useTheme } from '@bluebase/core';
import React from 'react';
import { TextStyle, ViewStyle } from 'react-native';
export interface ToDoAppIconStyles {
iconColor: { color: TextStyle['color'] };
root: ViewStyle;
}
export interface ToDoAppIconProps {
size: number;
styles?: Partial<ToDoAppIconStyles>;
}
export const ToDoAppIcon = (props: ToDoAppIconProps) => {
const { size } = props;
const { theme } = useTheme();
const styles: ToDoAppIconStyles = useStyles('ToDoAppIcon', props, {
iconColor: {
color: theme.palette.error.contrastText,
},
root: {
backgroundColor: theme.palette.error.main,
borderRadius: theme.shape.borderRadius * 3,
alignItems: 'center',
justifyContent: 'center',
height: size,
width: size,
},
});
return (
<View style={styles.root}>
<DynamicIcon
type="icon"
name="checkbox-multiple-marked-outline"
color={styles.iconColor.color}
size={size * 0.75}
/>
</View>
);
};
ToDoAppIcon.defaultProps = {
size: 100,
};export * from './ToDoAppIcon';
import { ToDoAppIcon } from './ToDoAppIcon';
export default ToDoAppIcon;import { ToDoAppIcon } from './ToDoAppIcon';
export const components = {
ToDoAppIcon,
};import { createPlugin } from '@bluebase/core';
import { ToDoAppIcon } from './components/ToDoAppIcon';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
components: {
ToDoAppIcon,
},
icon: {
component: 'ToDoAppIcon',
type: 'component',
},
indexRoute: 'HomeScreen',
});import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginMaterialUI from '@bluebase/plugin-material-ui';
import BlueBasePluginReactRouter from '@bluebase/plugin-react-router';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginMaterialUI,
BlueBasePluginReactRouter,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginReactNativePaper from '@bluebase/plugin-react-native-paper';
import BlueBasePluginReactNavigation from '@bluebase/plugin-react-navigation';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginReactNativePaper,
BlueBasePluginReactNavigation,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];expo start

"graphql-codegen": "graphql-codegen",name: GraphQL API
schema:
- [[API_URL]]/graphql/v1:
headers:
apiKey: "[[API_KEY]]"
documents: ./src/**/*.graphql.ts
generates:
./src/graphql-types.ts:
plugins:
- typescript
- typescript-operations


yarn add @bluebase/coreimport React from 'react';
import { BlueBaseApp } from '@bluebase/core';
export default function App() {
return (
<BlueBaseApp />
);
}expo startimport React from 'react';
import { Text, View } from 'react-native';
export const PendingTasksScreen = () => {
return (
<View style={{ padding: 10 }}>
<Text>PendingTasksScreen</Text>
</View>
);
};
PendingTasksScreen.displayName = 'PendingTasksScreen';export * from './PendingTasksScreen';
import { PendingTasksScreen } from './PendingTasksScreen';
export default PendingTasksScreen;import { PendingTasksScreen } from './PendingTasksScreen';
export const screens = {
PendingTasksScreen,
};import { createPlugin } from '@bluebase/core';
import { ToDoAppIcon } from './components/ToDoAppIcon';
import { PendingTasksScreen } from './components/PendingTasksScreen';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
// ... Other plugin properties
indexRoute: 'TasksApp',
components: {
// Components
ToDoAppIcon,
// Screens
PendingTasksScreen,
},
routes: [{
name: 'TasksApp',
screen: 'PendingTasksScreen',
path: '',
exact: false,
options: {
title: 'My Tasks',
},
}]
});

import BlueBasePluginApollo from '@bluebase/plugin-apollo';
import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginMaterialUI from '@bluebase/plugin-material-ui';
import BlueBasePluginReactRouter from '@bluebase/plugin-react-router';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginApollo,
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginMaterialUI,
BlueBasePluginReactRouter,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];import BlueBasePluginApollo from '@bluebase/plugin-apollo';
import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginReactNativePaper from '@bluebase/plugin-react-native-paper';
import BlueBasePluginReactNavigation from '@bluebase/plugin-react-navigation';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginApollo,
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginReactNativePaper,
BlueBasePluginReactNavigation,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];
export const configs = {
// Apollo Graphql Configs
'plugin.apollo.httpLinkOptions': {
uri: [[API_URL]] + '/graphql/v1',
headers: {
apiKey: [[API_KEY]]
}
},
};import 'react-native-gesture-handler';
import { BlueBaseApp } from '@bluebase/core';
import React from 'react';
import { configs } from './configs';
import { plugins } from './plugins';
export default function App() {
return (
<BlueBaseApp configs={configs} plugins={plugins} />
);
}
// Learn more https://docs.expo.io/guides/customizing-metro
const { getDefaultConfig } = require('@expo/metro-config');
const config = getDefaultConfig(__dirname);
// https://github.com/facebook/metro/issues/535
// https://github.com/apollographql/apollo-client/releases/tag/v3.5.4
config.resolver.sourceExts = process.env.RN_SRC_EXT
? [...process.env.RN_SRC_EXT.split(',').concat(config.resolver.sourceExts), 'cjs'] // <-- cjs added here
: [...config.resolver.sourceExts, 'cjs']; // <-- cjs added here
// https://docs.expo.dev/bare/installing-updates/
config.transformer.assetPlugins = [
...config.transformer.assetPlugins,
'expo-asset/tools/hashAssetFiles',
];
module.exports = config;-- Rebuild the GraphQL Schema Cache
select graphql.rebuild_schema();









routes: [{
name: 'EditTask',
screen: 'EditTaskScreen',
path: 't/:taskId',
exact: true,
options: {
title: 'Edit Task',
},
},
{
name: 'TasksApp',
screen: 'PendingTasksScreen',
path: '',
exact: false,
options: {
title: 'My Tasks',
},
}]http://localhost:19006/p/tasks/t/123import { Button, View } from '@bluebase/components';
import { useNavigation } from '@bluebase/core';
import React, { useCallback } from 'react';
import { Text } from 'react-native';
export const PendingTasksScreen = () => {
const { push } = useNavigation();
const goToEdit = useCallback(() => {
push('EditTask', { taskId: '123' });
}, []);
return (
<View>
<Text>PendingTasksScreen</Text>
<Button title="Go To Edit Screen" onPress={goToEdit} />
</View>
);
};
PendingTasksScreen.displayName = 'PendingTasksScreen';import { useNavigation } from '@bluebase/core';
import React from 'react';
import { Text, View } from 'react-native';
export const EditTaskScreen = () => {
const { getParam } = useNavigation();
const taskId = getParam('taskId', null);
return (
<View style={{ padding: 10 }}>
<Text>EditTaskScreen: {taskId}</Text>
</View>
);
};
EditTaskScreen.displayName = 'EditTaskScreen';



export const routes = [
{
name: 'CreateTask',
screen: 'CreateTaskScreen',
path: 'create',
exact: true,
options: {
title: 'Create Task',
},
},
{
name: 'EditTask',
screen: 'EditTaskScreen',
path: 't/:taskId',
exact: true,
options: {
title: 'Edit Task',
},
},
{
name: 'TasksApp',
screen: 'PendingTasksScreen',
path: '',
exact: false,
options: {
title: 'My Tasks',
},
}];import { createPlugin } from '@bluebase/core';
import { ToDoAppIcon } from './components/ToDoAppIcon';
import { routes } from './routes';
import { screens } from './screens';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
components: {
// Components
ToDoAppIcon,
// Screens
...screens,
},
icon: {
component: 'ToDoAppIcon',
type: 'component',
},
indexRoute: 'TasksApp',
routes,
});
http://localhost:19006/p/tasks/createimport { IconButton } from '@bluebase/components';
import { useNavigation, useTheme } from '@bluebase/core';
import React, { useCallback } from 'react';
export interface TaskCreateButtonProps {}
export const TaskCreateButton = (_props: TaskCreateButtonProps) => {
const { theme } = useTheme();
const { navigate } = useNavigation();
const onPress = useCallback(() => {
navigate('CreateTask');
}, []);
return (
<IconButton
name="plus"
onPress={onPress}
color={theme.palette.text.secondary}
/>
);
};export * from './TaskCreateButton';
import { TaskCreateButton } from './TaskCreateButton';
export default TaskCreateButton;{
name: 'TasksApp',
screen: 'PendingTasksScreen',
path: '',
exact: false,
options: {
title: 'My Tasks',
headerRight: () => <TaskCreateButton />
},
}

JsonGraphqlForm component.import BlueBasePluginApollo from '@bluebase/plugin-apollo';
import BlueBasePluginJsonGraphqlComponents from '@bluebase/plugin-json-graphql-components';
import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginMaterialUI from '@bluebase/plugin-material-ui';
import BlueBasePluginReactRouter from '@bluebase/plugin-react-router';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginApollo,
BlueBasePluginJsonGraphqlComponents,
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginMaterialUI,
BlueBasePluginReactRouter,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];
import BlueBasePluginApollo from '@bluebase/plugin-apollo';
import BlueBasePluginJsonGraphqlComponents from '@bluebase/plugin-json-graphql-components';
import BlueBasePluginJsonSchemaComponents from '@bluebase/plugin-json-schema-components';
import BlueBasePluginLauncher from '@bluebase/plugin-launcher';
import BlueBasePluginReactNativePaper from '@bluebase/plugin-react-native-paper';
import BlueBasePluginReactNavigation from '@bluebase/plugin-react-navigation';
import BlueBasePluginResponsiveGrid from '@bluebase/plugin-responsive-grid';
import BlueBasePluginSettingsApp from '@bluebase/plugin-settings-app';
import { MaterialCommunityIcons } from '@bluebase/plugin-vector-icons';
import Plugin from './src';
export const plugins = [
BlueBasePluginApollo,
BlueBasePluginJsonGraphqlComponents,
BlueBasePluginJsonSchemaComponents,
BlueBasePluginLauncher,
BlueBasePluginReactNativePaper,
BlueBasePluginReactNavigation,
BlueBasePluginResponsiveGrid,
MaterialCommunityIcons,
Plugin,
BlueBasePluginSettingsApp,
];
import gql from 'graphql-tag';
export const CreateTaskMutation = gql`
mutation CreateTaskMutation ($tasks: [tasksInsertInput!]!){
insertIntotasksCollection(objects: $tasks) {
records {
id
title
description
completed
}
}
}
`;yarn graphql-codegenimport { getComponent, useNavigation } from '@bluebase/core';
import { JsonGraphqlFormProps } from '@bluebase/plugin-json-graphql-components';
import React, { useCallback } from 'react';
import { CreateTaskMutationMutationVariables, TasksInsertInput } from '../../graphql-types';
import { CreateTaskMutation } from './CreateTaskMutation.graphql';
const JsonGraphqlForm = getComponent<JsonGraphqlFormProps<TasksInsertInput>>('JsonGraphqlForm');
export interface CreateTaskFormProps {}
export const CreateTaskForm = (props: CreateTaskFormProps) => {
const { navigate } = useNavigation();
const onSuccess = useCallback(() => {
navigate('TasksApp');
}, []);
const mapFormValuesToMutationVariables = useCallback(
(task: TasksInsertInput): CreateTaskMutationMutationVariables => {
return { tasks: [task] };
}, []);
return (
<JsonGraphqlForm
mutation={{
mutation: CreateTaskMutation
}}
onSuccess={onSuccess}
mapFormValuesToMutationVariables={mapFormValuesToMutationVariables}
{...props}
schema={{
validateOnBlur: false,
validateOnChange: false,
fields: [
{
autoFocus: true,
label: 'Title',
name: 'title',
required: true,
type: 'text',
},
{
label: 'Description',
name: 'description',
type: 'text',
},
{
label: 'Completed',
name: 'completed',
type: 'checkbox',
},
{
name: 'status',
type: 'status',
},
{
fullWidth: true,
name: 'submit',
title: 'Create Task',
type: 'submit',
},
],
}}
/>
);
};
CreateTaskForm.displayName = 'CreateTaskForm';export * from './CreateTaskForm';
import { CreateTaskForm } from './CreateTaskForm';
export default CreateTaskForm;import React from 'react';
import CreateTaskForm from '../../components/CreateTaskForm';
export const CreateTaskScreen = () => {
return (
<CreateTaskForm />
);
};
CreateTaskScreen.displayName = 'CreateTaskScreen';









import { createPlugin } from '@bluebase/core';
import { ToDoAppIcon } from './components/ToDoAppIcon';
import { filters } from './filters';
import { lang } from './lang';
import { routes } from './routes';
import { screens } from './screens';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
assets: {
NoTasks: require('../assets/no-tasks-light.png'),
},
// ... Other properties
});<ComponentState
imageSource="NoTasks"
title={__('No tasks')}
imageProps={{ resizeMode: 'contain' }}
description={__('Start by creating a new task')}
actionTitle={__('Create Task')}
actionOnPress={goToCreate}
actionProps={{ size: 'small', color: 'success', variant: 'outlined' }}
{...props}
/>assets: {
NoTasks_dark: require('../assets/no-tasks-dark.png'),
NoTasks_light: require('../assets/no-tasks-light.png'),
},





import { Checkbox, List } from '@bluebase/components';
import { getComponent, useNavigation } from '@bluebase/core';
import { PlaceholderListItemProps } from '@bluebase/plugin-rn-placeholder';
import React, { useCallback } from 'react';
import { Tasks } from '../../graphql-types';
const PlaceholderListItem = getComponent<PlaceholderListItemProps>('PlaceholderListItem');
export interface TaskListItemProps extends Tasks {
loading?: boolean;
}
export const TaskListItem = (props: TaskListItemProps) => {
const {
id,
title,
description,
completed,
loading,
} = props;
if (loading === true) {
return <PlaceholderListItem avatar description variant="icon" />;
}
const { push } = useNavigation();
const onPress = useCallback(() => {
push('EditTask', { taskId: id });
}, [id]);
return (
<List.Item
title={title}
description={description}
left={<Checkbox checked={!!completed} disabled />}
onPress={onPress}
/>
);
};
TaskListItem.defaultProps = {};
TaskListItem.displayName = 'TaskListItem';export * from './TaskListItem';
import { TaskListItem } from './TaskListItem';
export default TaskListItem;import { ComponentState, ComponentStateProps } from '@bluebase/components';
import { useNavigation } from '@bluebase/core';
import React, { useCallback } from 'react';
export interface TaskListEmptyStateProps extends ComponentStateProps {}
export const TaskListEmptyState = (props: TaskListEmptyStateProps) => {
const { navigate } = useNavigation();
const goToCreate = useCallback(() => navigate('CreateTask'), []);
return (
<ComponentState
title="No tasks"
description="Start by creating a new task"
actionTitle="Create Task"
imageProps={{ resizeMode: 'contain' }}
actionOnPress={goToCreate}
actionProps={{ size: 'small', color: 'success', variant: 'outlined' }}
{...props}
/>
);
};
TaskListEmptyState.displayName = 'TaskListEmptyState';export * from './TaskListEmptyState';
import { TaskListEmptyState } from './TaskListEmptyState';
export default TaskListEmptyState;import { FetchMoreOptions } from '@apollo/client';
import gql from 'graphql-tag';
import { TasksCollectionQueryQuery } from '../../graphql-types';
export const TasksCollectionQuery = gql`
query TasksCollectionQuery(
$filter: tasksFilter
$first: Int
# $last: Int
# $before: Cursor
$after: Cursor
) {
tasksCollection(
filter: $filter
first: $first
# last: $last
# before: $before
after: $after
) {
edges {
cursor
node {
id
title
completed
}
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
startCursor
}
}
}
`;
export const TasksCollectionQueryUpdateQueryFn: FetchMoreOptions<TasksCollectionQueryQuery>['updateQuery'] = (
previousResult,
{ fetchMoreResult }
) => {
if (!fetchMoreResult) {
return previousResult;
}
const prevEdges = previousResult.tasksCollection?.edges || [];
const newEdges = fetchMoreResult.tasksCollection?.edges || [];
return {
// Put the new items at the end of the list and update `pageInfo`
// so we have the new `endCursor` and `hasNextPage` values
tasksCollection: {
...previousResult.tasksCollection,
edges: [...prevEdges, ...newEdges],
pageInfo: {
...previousResult.tasksCollection?.pageInfo,
endCursor: fetchMoreResult.tasksCollection?.pageInfo?.endCursor,
hasNextPage: !!fetchMoreResult.tasksCollection?.pageInfo?.hasNextPage,
hasPreviousPage: !!fetchMoreResult.tasksCollection?.pageInfo?.hasPreviousPage,
startCursor: fetchMoreResult.tasksCollection?.pageInfo?.startCursor,
},
},
};
};yarn graphql-codegenimport { QueryResult } from '@apollo/client';
import { Divider } from '@bluebase/components';
import { getComponent } from '@bluebase/core';
import { GraphqlConnection, GraphqlListProps } from '@bluebase/plugin-json-graphql-components';
import React from 'react';
import { ListRenderItemInfo } from 'react-native';
import { Tasks, TasksCollectionQueryQuery } from '../../graphql-types';
import TaskListEmptyState from '../TaskListEmptyState';
import { TaskListItem, TaskListItemProps } from '../TaskListItem';
import { TasksCollectionQuery, TasksCollectionQueryUpdateQueryFn } from './TasksCollectionQuery.graphql';
const GraphqlList = getComponent<GraphqlListProps<TaskListItemProps, TasksCollectionQueryQuery>>('GraphqlList');
function mapQueryResultToConnection(result: QueryResult<TasksCollectionQueryQuery>) {
return result.data?.tasksCollection as GraphqlConnection<Tasks>;
}
function renderItem({ item }: ListRenderItemInfo<TaskListItemProps>) {
return <TaskListItem {...item} />;
}
const renderDivider = () => <Divider inset />;
export interface TaskListProps {
completed: boolean;
}
export const TaskList = (props: TaskListProps) => {
const { completed } = props;
const itemsPerPage = 10;
return (
<GraphqlList
key="task-list"
pagination="infinite"
itemsPerPage={itemsPerPage}
query={TasksCollectionQuery}
updateQueryInfinitePagination={TasksCollectionQueryUpdateQueryFn}
mapQueryResultToConnection={mapQueryResultToConnection}
renderItem={renderItem}
ItemSeparatorComponent={renderDivider}
ListEmptyComponent={TaskListEmptyState}
queryOptions={{
variables: {
filter:{ completed: { eq: completed } }
}
}}
/>
);
};
TaskList.displayName = 'TaskList';export * from './TaskList';
import { TaskList } from './TaskList';
export default TaskList;import React from 'react';
import { TaskList } from '../../components/TaskList';
export const PendingTasksScreen = () => {
return (
<TaskList completed={false} />
);
};
PendingTasksScreen.displayName = 'PendingTasksScreen';import React from 'react';
import TaskList from '../../components/TaskList';
export const CompletedTasksScreen = () => {
return (
<TaskList completed />
);
};
CompletedTasksScreen.displayName = 'CompletedTasksScreen';import gql from 'graphql-tag';
export const UpdateTaskMutation = gql`
mutation UpdateTaskMutation(
$id: UUID!
$title: String
$description: String
$completed: Boolean
) {
updatetasksCollection(
filter: { id: { eq: $id } }
set: {
title: $title,
description: $description,
completed: $completed
}
) {
affectedCount
records {
id
title
description
completed
}
}
}
`;


yarn graphql-codegenimport { getComponent, useNavigation } from '@bluebase/core';
import { JsonGraphqlFormProps } from '@bluebase/plugin-json-graphql-components';
import React, { useCallback } from 'react';
import {
TasksCollectionQueryQuery,
TasksCollectionQueryQueryVariables,
TasksInsertInput,
UpdateTaskMutationMutationVariables
} from '../../graphql-types';
import { TasksCollectionQuery } from '../TaskList/TasksCollectionQuery.graphql';
import { UpdateTaskMutation } from './UpdateTaskMutation.graphql';
const JsonGraphqlForm = getComponent<JsonGraphqlFormProps<any>>('JsonGraphqlForm');
export interface EditTaskFormProps {
id: string;
}
export const EditTaskForm = (props: EditTaskFormProps) => {
const { navigate } = useNavigation();
const { id } = props;
const onSuccess = useCallback(() => {
navigate('TasksApp');
}, []);
const mapQueryDataToInitialValues = useCallback(
(data: TasksCollectionQueryQuery) => {
return data?.tasksCollection?.edges[0]?.node;
}, []);
const mapFormValuesToMutationVariables = useCallback(
(task: TasksInsertInput): UpdateTaskMutationMutationVariables => {
return {
id: task.id,
title: task.title,
description: task.description,
completed: task.completed
};
}, []);
const queryVariables: TasksCollectionQueryQueryVariables = {
filter: {
id: { 'eq': id }
}
};
return (
<JsonGraphqlForm
query={{
query: TasksCollectionQuery,
variables: queryVariables
}}
mutation={{
mutation: UpdateTaskMutation,
refetchQueries: [TasksCollectionQuery],
awaitRefetchQueries: true
}}
onSuccess={onSuccess}
mapFormValuesToMutationVariables={mapFormValuesToMutationVariables}
mapQueryDataToInitialValues={mapQueryDataToInitialValues}
{...props}
schema={{
validateOnBlur: false,
validateOnChange: false,
fields: [
{
autoFocus: true,
label: 'Title',
name: 'title',
required: true,
type: 'text',
},
{
label: 'Description',
name: 'description',
type: 'text',
},
{
label: 'Completed',
name: 'completed',
type: 'checkbox',
},
{
name: 'status',
type: 'status',
},
{
name: 'submit',
title: 'Update Task',
type: 'submit',
},
],
}}
/>
);
};
EditTaskForm.displayName = 'EditTaskForm';export * from './EditTaskForm';
import { EditTaskForm } from './EditTaskForm';
export default EditTaskForm;import { useNavigation } from '@bluebase/core';
import React from 'react';
import EditTaskForm from '../../components/EditTaskForm';
export const EditTaskScreen = () => {
const { getParam } = useNavigation();
const taskId = getParam('taskId', null);
return (
<EditTaskForm id={taskId} />
);
};
EditTaskScreen.displayName = 'EditTaskScreen';tabbottom-tabsdrawer{
name: 'TasksApp',
screen: Noop,
path: '',
exact: false,
options: {
title: 'My Tasks',
headerRight: () => <TaskCreateButton />
},
navigator: {
headerMode: 'none',
type: 'tab',
routes: [{
exact: true,
name: 'PendingTask',
path: 'pending',
screen: 'PendingTasksScreen',
options: {
title: 'Pending',
},
}, {
exact: true,
name: 'CompletedTasks',
path: 'completed',
screen: 'CompletedTasksScreen',
options: {
title: 'Completed',
},
}],
},
}{
name: 'TasksApp',
screen: Noop,
path: '',
exact: false,
options: {
title: 'My Tasks',
headerRight: () => <TaskCreateButton />
},
navigator: {
headerMode: 'none',
type: 'tab',
routes: [{
exact: true,
name: 'PendingTask',
path: 'pending',
screen: 'PendingTasksScreen',
options: {
title: 'Pending',
tabBarIcon: ({ color }) => <Icon name="checkbox-multiple-blank-outline" color={color} />,
},
}, {
exact: true,
name: 'CompletedTasks',
path: 'completed',
screen: 'CompletedTasksScreen',
options: {
title: 'Completed',
tabBarIcon: ({ color }) => <Icon name="checkbox-multiple-marked" color={color} />,
},
}],
tabBarOptions: {
showIcon: true,
tabStyle: {
flexDirection: 'row',
},
},
},
}



export const configs = {
'locale.options': {
en: 'English',
fr: 'French',
ur: 'اُردُو',
},
// ... Other configs
};import { IntlMessages } from '@bluebase/core';
export const ur = (messages: IntlMessages) => ({
...messages,
'Title': 'عنوان',
'Description': 'تفصیل',
'Pending': 'زیر التواء',
'Completed': 'مکمل',
'Tasks': 'کام',
'My Tasks': 'میری ٹاسکس',
'No tasks': 'کوئی کام نہیں',
'Start by creating a new task': 'ایک نیا کام بنا کر شروع کریں۔',
'Create Task': 'ٹاسک بنائیں',
'Edit Task': 'ٹاسک ترمیم کریں',
'Update Task': 'ٹاسک تدوین کریں',
});
export default ur;import { ur } from './ur';
export const lang = {
'bluebase.intl.messages.ur': ur,
};import { createPlugin } from '@bluebase/core';
import { ToDoAppIcon } from './components/ToDoAppIcon';
import { lang } from './lang';
import { routes } from './routes';
import { screens } from './screens';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
filters: {
...lang,
},
// ... other plugin properties
});
import { ComponentState, ComponentStateProps } from '@bluebase/components';
import { useIntl, useNavigation } from '@bluebase/core';
import React, { useCallback } from 'react';
export interface TaskListEmptyStateProps extends ComponentStateProps {}
export const TaskListEmptyState = (props: TaskListEmptyStateProps) => {
const { __ } = useIntl();
const { navigate } = useNavigation();
const goToCreate = useCallback(() => navigate('CreateTask'), []);
return (
<ComponentState
title={__('No tasks')}
description={__('Start by creating a new task')}
actionTitle={__('Create Task')}
imageProps={{ resizeMode: 'contain' }}
actionOnPress={goToCreate}
actionProps={{ size: 'small', color: 'success', variant: 'outlined' }}
{...props}
/>
);
};
TaskListEmptyState.displayName = 'TaskListEmptyState';





const itemsPerPage = 10;const [itemsPerPage] = useConfig('tasks.itemsPerPage');import { QueryResult } from '@apollo/client';
import { Divider } from '@bluebase/components';
import { getComponent, useConfig } from '@bluebase/core';
import { GraphqlConnection, GraphqlListProps } from '@bluebase/plugin-json-graphql-components';
import React from 'react';
import { ListRenderItemInfo } from 'react-native';
import { Tasks, TasksCollectionQueryQuery, TasksCollectionQueryQueryVariables } from '../../graphql-types';
import TaskListEmptyState from '../TaskListEmptyState';
import { TaskListItem, TaskListItemProps } from '../TaskListItem';
import { TasksCollectionQuery, TasksCollectionQueryUpdateQueryFn } from './TasksCollectionQuery.graphql';
const GraphqlList = getComponent<GraphqlListProps<TaskListItemProps, TasksCollectionQueryQuery>>('GraphqlList');
function mapQueryResultToConnection(result: QueryResult<TasksCollectionQueryQuery>) {
return result.data?.tasksCollection as GraphqlConnection<Tasks>;
}
function renderItem({ item }: ListRenderItemInfo<TaskListItemProps>) {
return <TaskListItem {...item} />;
}
const renderDivider = () => <Divider inset />;
export interface TaskListProps {
completed: boolean;
}
export const TaskList = (props: TaskListProps) => {
const { completed } = props;
const [itemsPerPage] = useConfig('tasks.itemsPerPage');
const variables: TasksCollectionQueryQueryVariables = {
filter: {
completed: { 'eq': completed }
}
};
return (
<GraphqlList
key="task-list"
pagination="infinite"
itemsPerPage={itemsPerPage}
query={TasksCollectionQuery}
updateQueryInfinitePagination={TasksCollectionQueryUpdateQueryFn}
mapQueryResultToConnection={mapQueryResultToConnection}
renderItem={renderItem}
ItemSeparatorComponent={renderDivider}
ListEmptyComponent={TaskListEmptyState}
queryOptions={{
variables
}}
/>
);
};
TaskList.displayName = 'TaskList';import { createPlugin } from '@bluebase/core';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
defaultConfigs: {
'tasks.itemsPerPage': 10,
}
// ... other properties
});export const configs = {
'tasks.itemsPerPage': 5,
// ... other configs
};import { getComponent, useConfig } from '@bluebase/core';
import { JsonFormProps } from '@bluebase/plugin-json-schema-components';
import { FormikHelpers } from 'formik';
import React from 'react';
interface TaskSettingsFormValues {
itemsPerPage: number;
}
const JsonForm = getComponent<JsonFormProps<TaskSettingsFormValues>>('JsonForm');
export interface TaskSettingsFormProps {}
export const TaskSettingsForm = (props: TaskSettingsFormProps) => {
const [itemsPerPage, setItemsPerPage] = useConfig('tasks.itemsPerPage');
return (
<JsonForm
{...props}
schema={{
validateOnBlur: false,
validateOnChange: false,
fields: [
{
autoFocus: true,
label: 'Items per page',
name: 'itemsPerPage',
required: true,
type: 'number',
},
{
schema: { component: 'Divider' },
type: 'component',
},
{
direction: 'right',
name: 'form-actions',
type: 'inline',
fields: [
{
name: 'reset',
type: 'reset',
},
{
name: 'submit',
title: 'Save',
type: 'submit',
},
],
},
],
initialValues: {
itemsPerPage,
},
onSubmit: (values: TaskSettingsFormValues, helpers: FormikHelpers<TaskSettingsFormValues>) => {
const { setSubmitting } = helpers;
setItemsPerPage(values.itemsPerPage);
// Wait one second and then setSubmitting to false
setTimeout(() => setSubmitting(false), 1000);
}
}}
/>
);
};
TaskSettingsForm.displayName = 'TaskSettingsForm';export * from './TaskSettingsForm';
import { TaskSettingsForm } from './TaskSettingsForm';
export default TaskSettingsForm;import { SettingsPageProps } from '@bluebase/plugin-settings-app';
import TaskSettingsForm from './components/TaskSettingsForm';
export const filters = {
'bluebase.plugin.setting-app.pages': [
{
key: 'bluebase-settings-todo-page',
priority: 20,
value: (pages: SettingsPageProps[]) => [
{
name: 'TaskSettings',
path: 'task',
options: {
drawerIcon: { type: 'icon', name: 'checkbox-multiple-marked' },
title: 'Tasks',
},
items: [
{
name: 'task-settings',
component: TaskSettingsForm,
title: 'Task Settings',
description: 'Configure your tasks',
},
],
},
...pages,
],
},
],
};import { createPlugin } from '@bluebase/core';
import { filters } from './filters';
import { lang } from './lang';
export default createPlugin({
key: 'tasks',
name: 'Tasks',
description: 'A todo app made with BlueBase framework.',
filters: {
...filters,
...lang,
},
// ... Other properties
});



import { DynamicIcon, View } from '@bluebase/components';
import { useStyles, useTheme } from '@bluebase/core';
import React from 'react';
import { TextStyle, ViewStyle } from 'react-native';
export interface ToDoAppIconStyles {
iconColor: { color: TextStyle['color'] };
root: ViewStyle;
}
export interface ToDoAppIconProps {
size: number;
styles?: Partial<ToDoAppIconStyles>;
}
export const ToDoAppIcon = (props: ToDoAppIconProps) => {
const { size } = props;
const { theme } = useTheme();
const styles: ToDoAppIconStyles = useStyles('ToDoAppIcon', props, {
iconColor: {
color: theme.palette.error.contrastText,
},
root: {
backgroundColor: theme.palette.error.main,
borderRadius: theme.shape.borderRadius * 3,
alignItems: 'center',
justifyContent: 'center',
height: size,
width: size,
},
});
return (
<View style={styles.root}>
<DynamicIcon
type="icon"
name="checkbox-multiple-marked-outline"
color={styles.iconColor.color}
size={size * 0.75}
/>
</View>
);
};
ToDoAppIcon.defaultProps = {
size: 100,
};
defaultStyles

export const configs = {
// ... Other Configs
'theme.overrides': {
light: {
components: {
ToDoAppIcon: {
root: {
backgroundColor: '#6750A4',
}
}
}
}
}
};
import gql from 'graphql-tag';
export const DeleteTaskMutation = gql`
mutation DeleteTaskMutation($id: UUID!) {
deleteFromtasksCollection(filter: { id: { eq: $id } }) {
records {
id
}
}
}
`;yarn graphql-codegenimport { useMutation } from '@apollo/client';
import { IconButton } from '@bluebase/components';
import { useNavigation, useTheme } from '@bluebase/core';
import React, { useCallback } from 'react';
import { DeleteTaskMutationMutation } from '../../graphql-types';
import { TasksCollectionQuery } from '../TaskList/TasksCollectionQuery.graphql';
import { DeleteTaskMutation } from './DeleteTaskMutation.graphql';
export interface TaskDeleteButtonProps {
id: string
}
export const TaskDeleteButton = (props: TaskDeleteButtonProps) => {
const { id } = props;
const { theme } = useTheme();
const { navigate } = useNavigation();
const onCompleted = useCallback(() => {
navigate('TasksApp');
}, []);
const [deleteTask, { loading }] = useMutation<DeleteTaskMutationMutation>(DeleteTaskMutation, {
onCompleted,
refetchQueries: [TasksCollectionQuery],
awaitRefetchQueries: true,
variables: { id }
});
return (
<IconButton
name="delete"
onPress={deleteTask}
color={theme.palette.text.secondary}
disabled={loading}
/>
);
};
TaskDeleteButton.displayName = 'TaskDeleteButton';export * from './TaskDeleteButton';
import { TaskDeleteButton } from './TaskDeleteButton';
export default TaskDeleteButton;{
name: 'EditTask',
screen: 'EditTaskScreen',
path: 't/:taskId',
exact: true,
options: ({ route }: any) => ({
title: 'Edit Task',
headerRight: () => <TaskDeleteButton id={route.params.taskId} />
}),
},

export default {
// ...other bluebase.ts properties
plugins: [{
name: 'Example Plugin',
key: 'example-plugin',
// ... other plugin properties
}]
}const ExamplePlugin = {
name: 'Example Plugin',
key: 'example-plugin',
// ... other plugin properties
}
await BB.Plugins.register(ExamplePlugin);
await BB.Filters.run('bluebase.plugins.initialize', ExamplePlugin);import { createPlugin } from '@bluebase/core';
export const ExamplePlugin = createPlugin({
key: 'example',
name: 'Example Plugin',
description: 'This is just an example plugin.',
version: '1.0.0',
categories: ['theme', 'app'],
icon: () => ({
type: 'icon',
name: 'rocket',
}),
defaultConfigs: {
'plugin.example.foo': 'bar'
},
// ... any components come here
components: [{
key: 'Logo',
value: import('./Logo')
}],
// ... add other configs, i.e. themes, filters, etc
});import { createPlugin } from '@bluebase/core';
export const AnalyticsPlugin = createPlugin({
key: 'analytics',
name: 'Analytics Plugin',
categories: ['analytics'],
filters: {
'bluebase.analytics.track': (data: AnalyticsTrackData) => {
// send data to analytics provider here
}
}
});plugin.{key}.{config}pluign.example.fooconst Plugin = {
themes: [{
name: 'Material UI (Light)',
key: 'material-ui-light',
mode: 'light',
// .. other theme props
}, {
name: 'Material UI (Dark)',
key: 'material-ui-dark',
mode: 'dark',
// .. other theme props
}]
}const Plugin = {
public themes = [
import('path/to/theme-1'),
import('path/to/theme-2'),
]
}class MaterialUIPlugin extends Plugin {
public themes = [{
name: 'Material UI (Light)',
key: 'material-ui-light',
mode: 'light',
theme: import('./theme-rules-light'),
// .. other theme props
}, {
name: 'Material UI (Dark)',
key: 'material-ui-dark',
mode: 'dark',
theme: import('./theme-rules-dark'),
// .. other theme props
}]
}import { createPlugin } from '@bluebase/core';
export const LoggerPlugin = createPlugin({
key: 'logger',
name: 'Logger Plugin',
categories: ['logging'],
filters: {
'bluebase.logger.log': (message: string, data: any) => {
// send data to logging provider here
}
}
});const Logo = props => {
return (
<View>/* component code */</View>
)
}
await BB.Components.register({
key: 'Logo',
value: Logo,
preload: true,
hocs: [withRouter],
styles: {},
source: {},
});function filter_profanity(content: string) {
const profanities = array('badword','alsobad','...');
return content.replace(profanities, '{censored}');
}createPlugin({
// ... Other properties
filters: {
'post.comment': [{
key: 'post-comment-profanity-remover',
value: filter_profanity,
priority: 2,
}]
},
});await BB.Filters.register({
event: 'post.comment',
key: 'post-comment-profanity-remover',
value: filter_profanity,
priority: 2,
});const newValue = await BB.Filters.run(event, value, [context])await BB.Filters.run(
'post.comment',
'A comment with profanity',
{ postId: '123' }
);const { value, loading, error } = useFilter(
'post.comment',
'A comment with profanity',
{ postId: '123' }
);const Logo = props => {
return (
<View>/* component code */</View>
)
}
await BB.Components.register('Logo', Logo);BB.Components.addHocs('PostsList', withCurrentUser);await BB.Components.register({
key: 'PostsList',
value: PostsList,
hocs: [withList(options)]
});await BB.Components.register({
key: 'PostsList',
value: PostsList,
hocs: [
[withList, options]
]
});import { BlueBaseApp, Theme } from '@bluebase/core';
import React from 'react';
const GreenTheme = new Theme({
key: 'green-theme',
name: 'Green Theme',
light: {
palette: {
primary: {
main: '#00a013',
dark: '#007d00',
light: '#49bb47',
},
secondary: {
main: '#a0008d',
dark: '#830082',
light: '#be5cad',
}
}
},
dark: {
palette: {
primary: {
main: '#00a013',
dark: '#007d00',
light: '#49bb47',
},
secondary: {
main: '#a0008d',
dark: '#830082',
light: '#be5cad',
}
}
},
});
export default function App() {
return (
<BlueBaseApp themes={[GreenTheme]} />
);
}import { BlueBaseApp, Theme } from '@bluebase/core';
import React from 'react';
import GreenTheme from './theme';
export default function App() {
return (
<BlueBaseApp themes={[GreenTheme]} />
);
}import { createPlugin } from '@bluebase/core';
import GreenTheme from './theme';
export default createPlugin({
key: 'green-theme-plugin',
name: 'Green Theme Plugin',
themes: [GreenTheme]
});import { buildTheme } from '@bluebase/core';
export const MyCustomTheme = ('light')({
name: 'MyCustomTheme',
key: 'my-custom-theme',
// ... theme props
});import { BlueBaseApp } from '@bluebase/core';
import { MyCustomTheme } from './MyCustomTheme.ts';
export const App = () => (
<BlueBaseApp themes={[MyCustomTheme]} />
);<View>
<Text>Default light theme here</Text>
<ThemeProvider theme="bluebase-dark">
<View style={{ backgroundColor: theme.palette.background.default }}>
<Text>Dark theme here</Text>
</View>
</ThemeProvider>
<View><ThemeProvider theme="bluebase-dark" overrides={{ palette: { background: { default: 'red' } } }} >
{/* All components here will now have a red background color */}
</ThemeProvider>import { BlueBase, BlueBaseConsumer } from '@bluebase/core';
const Header = () => (
<BlueBaseConsumer>
{(BB: BlueBase) => {
const Logo = BB.Components.resolve('Logo');
return <Logo />;
}}
</BlueBaseConsumer>
);import { getComponent } from '@bluebase/core';
const Logo = getComponent('Logo');
const Header = () => (<Logo />);import { getComponent } from '@bluebase/core';
interface LogoProps {
// ... props
}
const Logo = getComponent<LogoProps>('Logo');- import { Image, Text, View } from 'react-native';
+ import { Image, Text, View } from '@bluebase/components';const Logo = BB.Components.resolve('AnimatedLogo', 'SingleColorLogo', 'Logo');const Logo = getComponent('AnimatedLogo', 'SingleColorLogo', 'Logo');const rawLogoComponent = await BB.Components.getValue('Logo');BB.Analytics.track({
name: 'albumVisit',
// Attribute values must be strings
attributes: { genre: '', artist: '' }
});BB.Analytics.track({
name: 'albumVisit',
attributes: {},
metrics: { minutesListened: 30 }
});import React from 'react';
import { Card } from '@bluebase/components';
export class ThemedCard extends React.Component {
static defaultStyles = {
'root': {
backgroundColor: 'blue'
},
'hover': {
backgroundColor: 'green'
}
}
render() {
const { styles, isHovering } = this.props;
return (<Card style={isHovering ? styles.hover : styles.root} />);
}
}class MaterialUIPlugin extends Plugin {
public components = {
ThemedCard: {
rawComponent: ThemedCardComponent,
styles: {
root: {
backgroundColor: 'orange'
}
}
}
}
}BB.Components.setStyles('ThemedCard', {
root: {
backgroundColor: 'orange'
}
});export const theme = {
// ...other theme props
components: {
ThemedCard: {
root: {
backgroundColor: 'yellow'
}
}
}
};const Foo = () => (
<ThemedCard styles={{
root: {
backgroundColor: 'red'
}
}} />
);interface ComponentStyles {
// rule
[key: string]: ViewStyle | TextStyle | ImageStyle | { [prop: string]: string };
}const styles = {
root: {
borderRadius: 4,
borderWidth: 0.5,
borderColor: '#d6d7da',
},
title: {
fontSize: 19,
fontWeight: 'bold',
},
activeTitle: {
color: 'red',
},
};const Foo = () => (
<RegistryValue registry="Components" key="View">
{
(Component) => <Component />;
}
</RegistryValue>
);import { BlueBase, BlueBaseApp } from '@bluebase/core';
export const App = () => (
<BlueBaseApp
components={{ /* Components Collection */ }}
configs={{ /* Configs Collection */ }}
filters={{ /* Filters Collection */ }}
plugins={{ /* Plugin Collection */ }}
themes={{ /* Theme Collection */ }}
/>
);import { BlueBase, BlueBaseApp } from '@bluebase/core';
const BB = new BlueBase();
// Custom business logic on BB object. i.e. Add filters, etc.
export const App = () => (<BlueBaseApp BB={BB} />);import { BlueBase, BlueBaseApp } from '@bluebase/core';
export const App = () => (
<BlueBaseApp>
{/* This child component will have access to BlueBase context */}
<CustomComponent />
</BlueBaseApp>
);import { BlueBase, BlueBaseConsumer } from '@bluebase/core';
export const CustomComponent = () => (
<BlueBaseConsumer>
{(BB: BlueBase) => {
// Use Context here
}}
</BlueBaseConsumer>
);interface ThemeContextData {
// Helper method to change current theme.
changeTheme: (slug: string) => void,
// Current theme
theme: Theme
}const ThemedComponent = () => (
<ThemeConsumer>
{
({ theme, changeTheme }: ThemeContextData) => {
// Use theme context here..
}
}
</ThemeConsumer>
);import {
BlueBase,
BlueBaseContext,
ThemeConsumer,
ThemeContextData,
Text,
View,
} from '@bluebase/core';
import { Picker } from 'react-native';
import React from 'react';
export class ThemePicker extends React.PureComponent {
static contextType = BlueBaseContext;
render() {
const BB: BlueBase = this.context;
const themes = [...BB.Themes.entries()];
return (
<ThemeConsumer children={({ theme, changeTheme }: ThemeContextData) => (
<View style={{ backgroundColor: theme.palette.background.default }}>
<Text>Select Theme</Text>
<Picker
selectedValue={BB.Configs.getValue('theme.name')}
style={{ width: 150 }}
onValueChange={changeTheme}>
{themes.map(entry => <Picker.Item label={entry[1].name} value={entry[0]} key={entry[0]} />)}
</Picker>
</View>
)} />
);
}
}import { ComponentState } from '@bluebase/core';
// Then somewhere in your app:
<ComponentState
title="Looks like your'e new here!"
description="Start by creating your first entry."
imageSource="https://picsum.photos/200"
styles={{ image: { width: 100, height: 100 } }}
actionTitle="Tap to Create"
/>import { JsonSchema } from '@bluebase/core';
// Then somewhere in your app:
<JsonSchema
filter="content-filter"
args={{ style: { color: 'blue' } }}
schema={{
component: 'Text',
props: {
style: {
color: 'red'
}
},
text: 'This is the page content.',
}} />import { EmptyState } from '@bluebase/core';
// Then somewhere in your app:
<EmptyState/>import { PluginIcon } from '@bluebase/core';
// Then somewhere in your app:
<PluginIcon id="redux-plugin" />import { DynamicIcon } from '@bluebase/core';
// Then somewhere in your app:
<DynamicIcon
type="icon"
size={250}
name="rocket"
/><DynamicIcon
type="image"
size={250}
source={{ uri: 'https://picsum.photos/200' }}
/>const CustomComponent = ({ size }: { size: number }) => (
<View style={{ height: size, width: size, backgroundColor: 'red' }} />
);
// Then somewhere in your component:
<DynamicIcon
type="component"
size={250}
component={CustomComponent}
/><DynamicIcon
type="component"
size={250}
component="CustomComponent" // equivalent to BB.Components.resolve('CustomComponent')
/>import { Noop } from '@bluebase/core';
// Then somewhere in your app:
<Noop />const CustomComponent = BB.Components.resolve('Option1', 'Option2', 'Noop');import { LoadingState } from '@bluebase/core';
// Then somewhere in your app:
<LoadingState timedOut={false} retry={retryFunction}/><DataObserver data={dataObj} >
{
({data, loading, empty}) => {
// Render UI based on params
}
}
</DataObserver>import { ErrorState } from '@bluebase/core';
// Then somewhere in your app:
<ErrorState retry={retryCallback} error={Error('Bang!')} />

<StatefulComponent data={data} loading={true} delay={200} timeout={10000}>
<Text>Content</Text>
</StatefulComponent><WaitObserver
delay={1000}
timeout={3000}
onTimeout={onTimeout}
onRetry={onRetry}
children={(props: WaitObserverChildrenProps) => <LoadingState {...props} />}
/><HoverObserver>
{({ isHovering }) => (
<YourChildComponent isActive={isHovering} />
)}
</HoverObserver><ErrorObserver>
<Text>Rendered if there is no error here</Text>
</ErrorObserver>