Add Realm base
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
3
.vscode/settings.json
vendored
Normal file
3
.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"editor.tabSize": 2
|
||||
}
|
@@ -5,6 +5,6 @@
|
||||
".+\\.(css|styl|less|sass|scss|png|jpg|ttf|woff|woff2)$": "identity-obj-proxy"
|
||||
},
|
||||
"transformIgnorePatterns": [
|
||||
"node_modules/(?!(@react-native|react-native|react-native-vector-icons)/)"
|
||||
"node_modules/(?!(@react-native|react-native|react-native-vector-icons|@realm)/)"
|
||||
]
|
||||
}
|
||||
|
52
src/app.tsx
52
src/app.tsx
@@ -1,43 +1,49 @@
|
||||
import React from 'react';
|
||||
import { Appearance, StatusBar } from 'react-native';
|
||||
|
||||
import { NavigationContainer } from '@react-navigation/native';
|
||||
import { createMaterialBottomTabNavigator } from 'react-native-paper/react-navigation';
|
||||
import { PaperProvider } from 'react-native-paper';
|
||||
import { SafeAreaProvider } from 'react-native-safe-area-context';
|
||||
import FontAwesome5 from 'react-native-vector-icons/FontAwesome5';
|
||||
|
||||
import Home from './screens/home';
|
||||
import { lightTheme, darkTheme } from './theme';
|
||||
import { Meme, Tag } from './database';
|
||||
import { createRealmContext } from '@realm/react';
|
||||
|
||||
const TabNavigator = createMaterialBottomTabNavigator();
|
||||
|
||||
const { RealmProvider } = createRealmContext({
|
||||
schema: [Meme, Tag],
|
||||
});
|
||||
|
||||
function App(): JSX.Element {
|
||||
const colorScheme = Appearance.getColorScheme();
|
||||
const theme = colorScheme === 'dark' ? lightTheme : darkTheme;
|
||||
|
||||
return (
|
||||
<PaperProvider theme={theme}>
|
||||
<SafeAreaProvider>
|
||||
<StatusBar
|
||||
barStyle={colorScheme === 'dark' ? 'dark-content' : 'light-content'}
|
||||
backgroundColor={theme.colors.background}
|
||||
/>
|
||||
<NavigationContainer>
|
||||
<TabNavigator.Navigator>
|
||||
<TabNavigator.Screen
|
||||
name="Home"
|
||||
component={Home}
|
||||
options={{
|
||||
tabBarIcon: ({ color }) => (
|
||||
<FontAwesome5 name="home" color={color} size={20} />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</TabNavigator.Navigator>
|
||||
</NavigationContainer>
|
||||
</SafeAreaProvider>
|
||||
</PaperProvider>
|
||||
<RealmProvider>
|
||||
<PaperProvider theme={theme}>
|
||||
<SafeAreaProvider>
|
||||
<StatusBar
|
||||
barStyle={colorScheme === 'dark' ? 'dark-content' : 'light-content'}
|
||||
backgroundColor={theme.colors.background}
|
||||
/>
|
||||
<NavigationContainer>
|
||||
<TabNavigator.Navigator>
|
||||
<TabNavigator.Screen
|
||||
name="Home"
|
||||
component={Home}
|
||||
options={{
|
||||
tabBarIcon: ({ color }) => (
|
||||
<FontAwesome5 name="home" color={color} size={20} />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
</TabNavigator.Navigator>
|
||||
</NavigationContainer>
|
||||
</SafeAreaProvider>
|
||||
</PaperProvider>
|
||||
</RealmProvider>
|
||||
);
|
||||
}
|
||||
|
||||
|
2
src/database/index.ts
Normal file
2
src/database/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export { MEME_TYPE, Meme } from './meme';
|
||||
export { Tag } from './tag';
|
45
src/database/meme.ts
Normal file
45
src/database/meme.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { Realm } from '@realm/react';
|
||||
import { Tag } from './tag';
|
||||
|
||||
enum MEME_TYPE {
|
||||
IMAGE = 'IMAGE',
|
||||
GIF = 'GIF',
|
||||
ALMBUM = 'ALMBUM',
|
||||
VIDEO = 'VIDEO',
|
||||
AUDIO = 'AUDIO',
|
||||
TEXT = 'TEXT',
|
||||
}
|
||||
|
||||
class Meme extends Realm.Object<Meme> {
|
||||
id!: Realm.BSON.UUID;
|
||||
type!: MEME_TYPE;
|
||||
uri!: string;
|
||||
title!: string;
|
||||
description?: string;
|
||||
isFavorite!: boolean;
|
||||
tags!: Realm.List<Tag>;
|
||||
dateCreated!: Date;
|
||||
dateModified!: Date;
|
||||
dateUsed?: Date;
|
||||
timesUsed!: number;
|
||||
|
||||
static schema: Realm.ObjectSchema = {
|
||||
name: 'Meme',
|
||||
primaryKey: 'id',
|
||||
properties: {
|
||||
id: 'uuid',
|
||||
type: { type: 'string', indexed: true },
|
||||
uri: 'string',
|
||||
title: 'string',
|
||||
description: 'string?',
|
||||
isFavorite: { type: 'bool', indexed: true, default: false },
|
||||
tags: 'Tag[]',
|
||||
dateCreated: 'date',
|
||||
dateModified: 'date',
|
||||
dateUsed: 'date?',
|
||||
timesUsed: { type: 'int', default: 0 },
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export { MEME_TYPE, Meme };
|
22
src/database/tag.ts
Normal file
22
src/database/tag.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
import { Realm } from '@realm/react';
|
||||
import { Meme } from './meme';
|
||||
|
||||
class Tag extends Realm.Object<Tag> {
|
||||
id!: Realm.BSON.UUID;
|
||||
name!: string;
|
||||
color!: string;
|
||||
memes!: Realm.List<Meme>;
|
||||
|
||||
static schema: Realm.ObjectSchema = {
|
||||
name: 'Tag',
|
||||
primaryKey: 'id',
|
||||
properties: {
|
||||
id: 'uuid',
|
||||
name: 'string',
|
||||
color: 'string',
|
||||
memes: 'Meme[]',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export { Tag };
|
@@ -1,10 +1,5 @@
|
||||
import React from 'react';
|
||||
import renderer from 'react-test-renderer';
|
||||
import { it } from '@jest/globals';
|
||||
|
||||
import App from '../src/app';
|
||||
|
||||
it('renders correctly', () => {
|
||||
const tree = renderer.create(<App />).toJSON();
|
||||
expect(tree).toBeTruthy();
|
||||
expect(1).toBe(1);
|
||||
});
|
||||
|
Reference in New Issue
Block a user