Skip to content

Commit 9f7019e

Browse files
committed
v3.0.0-canary.164
1 parent 86b6256 commit 9f7019e

File tree

30 files changed

+1538
-249
lines changed

30 files changed

+1538
-249
lines changed

examples/example/package.json

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
{
22
"name": "firecms-example",
3-
"version": "3.0.0-canary.163",
3+
"version": "3.0.0-canary.164",
44
"private": true,
55
"type": "module",
66
"dependencies": {
7-
"@firecms/collection_editor": "^3.0.0-canary.163",
8-
"@firecms/core": "^3.0.0-canary.163",
9-
"@firecms/data_enhancement": "^3.0.0-canary.163",
10-
"@firecms/data_export": "^3.0.0-canary.163",
11-
"@firecms/data_import": "^3.0.0-canary.163",
12-
"@firecms/data_import_export": "^3.0.0-canary.163",
13-
"@firecms/editor": "^3.0.0-canary.163",
14-
"@firecms/schema_inference": "^3.0.0-canary.163",
15-
"@firecms/ui": "^3.0.0-canary.163",
16-
"@firecms/user_management": "^3.0.0-canary.163",
7+
"@firecms/collection_editor": "^3.0.0-canary.164",
8+
"@firecms/core": "^3.0.0-canary.164",
9+
"@firecms/data_enhancement": "^3.0.0-canary.164",
10+
"@firecms/data_export": "^3.0.0-canary.164",
11+
"@firecms/data_import": "^3.0.0-canary.164",
12+
"@firecms/data_import_export": "^3.0.0-canary.164",
13+
"@firecms/editor": "^3.0.0-canary.164",
14+
"@firecms/schema_inference": "^3.0.0-canary.164",
15+
"@firecms/ui": "^3.0.0-canary.164",
16+
"@firecms/user_management": "^3.0.0-canary.164",
1717
"@fontsource/jetbrains-mono": "^5.1.1",
1818
"clsx": "^2.1.1",
1919
"firebase": "^10.14.1",

examples/example_cloud/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "firecms-example-cloud",
33
"private": true,
44
"type": "module",
5-
"version": "3.0.0-canary.163",
5+
"version": "3.0.0-canary.164",
66
"scripts": {
77
"dev": "vite",
88
"clean": "rm -rf dist && find ./src -name '*.js' -type f | xargs rm -f",
@@ -13,7 +13,7 @@
1313
"deploy:staging": "vite build && firecms deploy --project=firecms-demo-27150 --env-dev"
1414
},
1515
"dependencies": {
16-
"@firecms/cloud": "^3.0.0-canary.163",
16+
"@firecms/cloud": "^3.0.0-canary.164",
1717
"@fontsource/jetbrains-mono": "^5.1.1",
1818
"firebase": "^10.14.1",
1919
"react": "^18.3.1",

examples/example_next/package.json

+12-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firecms-example-next",
3-
"version": "3.0.0-canary.163",
3+
"version": "3.0.0-canary.164",
44
"private": true,
55
"type": "module",
66
"scripts": {
@@ -10,17 +10,17 @@
1010
"lint": "next lint"
1111
},
1212
"dependencies": {
13-
"@firecms/collection_editor": "^3.0.0-canary.163",
14-
"@firecms/collection_editor_firebase": "^3.0.0-canary.163",
15-
"@firecms/core": "^3.0.0-canary.163",
16-
"@firecms/data_enhancement": "^3.0.0-canary.163",
17-
"@firecms/data_export": "^3.0.0-canary.163",
18-
"@firecms/data_import": "^3.0.0-canary.163",
19-
"@firecms/editor": "^3.0.0-canary.163",
20-
"@firecms/firebase": "^3.0.0-canary.163",
21-
"@firecms/schema_inference": "^3.0.0-canary.163",
22-
"@firecms/ui": "^3.0.0-canary.163",
23-
"@firecms/user_management": "^3.0.0-canary.163",
13+
"@firecms/collection_editor": "^3.0.0-canary.164",
14+
"@firecms/collection_editor_firebase": "^3.0.0-canary.164",
15+
"@firecms/core": "^3.0.0-canary.164",
16+
"@firecms/data_enhancement": "^3.0.0-canary.164",
17+
"@firecms/data_export": "^3.0.0-canary.164",
18+
"@firecms/data_import": "^3.0.0-canary.164",
19+
"@firecms/editor": "^3.0.0-canary.164",
20+
"@firecms/firebase": "^3.0.0-canary.164",
21+
"@firecms/schema_inference": "^3.0.0-canary.164",
22+
"@firecms/ui": "^3.0.0-canary.164",
23+
"@firecms/user_management": "^3.0.0-canary.164",
2424
"@fontsource/jetbrains-mono": "^5.1.1",
2525
"@fontsource/playfair-display": "^5.1.0",
2626
"@fontsource/poppins": "^5.1.0",

examples/example_pro/package.json

+16-13
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,35 @@
11
{
22
"name": "firecms-example-pro",
3-
"version": "3.0.0-canary.163",
3+
"version": "3.0.0-canary.164",
44
"private": true,
55
"type": "module",
66
"dependencies": {
7-
"@firecms/collection_editor": "^3.0.0-canary.163",
8-
"@firecms/collection_editor_firebase": "^3.0.0-canary.163",
9-
"@firecms/core": "^3.0.0-canary.163",
10-
"@firecms/data_enhancement": "^3.0.0-canary.163",
11-
"@firecms/data_export": "^3.0.0-canary.163",
12-
"@firecms/data_import": "^3.0.0-canary.163",
13-
"@firecms/datatalk": "^3.0.0-canary.163",
14-
"@firecms/editor": "^3.0.0-canary.163",
15-
"@firecms/formex": "^3.0.0-canary.163",
16-
"@firecms/schema_inference": "^3.0.0-canary.163",
17-
"@firecms/ui": "^3.0.0-canary.163",
18-
"@firecms/user_management": "^3.0.0-canary.163",
7+
"@apollo/client": "^3.12.2",
8+
"@firecms/collection_editor": "^3.0.0-canary.164",
9+
"@firecms/collection_editor_firebase": "^3.0.0-canary.164",
10+
"@firecms/core": "^3.0.0-canary.164",
11+
"@firecms/data_enhancement": "^3.0.0-canary.164",
12+
"@firecms/data_export": "^3.0.0-canary.164",
13+
"@firecms/data_import": "^3.0.0-canary.164",
14+
"@firecms/datatalk": "^3.0.0-canary.164",
15+
"@firecms/editor": "^3.0.0-canary.164",
16+
"@firecms/formex": "^3.0.0-canary.164",
17+
"@firecms/schema_inference": "^3.0.0-canary.164",
18+
"@firecms/ui": "^3.0.0-canary.164",
19+
"@firecms/user_management": "^3.0.0-canary.164",
1920
"@fontsource/comic-neue": "^5.1.0",
2021
"@fontsource/jetbrains-mono": "^5.1.1",
2122
"@fontsource/noto-serif": "^5.1.0",
2223
"@supabase/supabase-js": "^2.46.2",
2324
"algoliasearch": "^5.15.0",
25+
"bson-objectid": "^2.0.4",
2426
"firebase": "^10.14.1",
2527
"react": "^18.3.1",
2628
"react-dom": "^18.3.1",
2729
"react-router": "^6.28.0",
2830
"react-router-dom": "^6.28.0",
2931
"react18-json-view": "^0.2.8",
32+
"reconnecting-websocket": "^4.4.0",
3033
"typeface-rubik": "^1.1.13"
3134
},
3235
"scripts": {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
import React, { useCallback, useMemo } from "react";
2+
3+
import "typeface-rubik";
4+
import "@fontsource/jetbrains-mono";
5+
6+
import {
7+
AppBar,
8+
Authenticator,
9+
CircularProgressCenter,
10+
DataSourceDelegate,
11+
Drawer,
12+
FireCMS,
13+
ModeControllerProvider,
14+
NavigationRoutes,
15+
Scaffold,
16+
SideDialogs,
17+
SnackbarProvider,
18+
useBuildLocalConfigurationPersistence,
19+
useBuildModeController,
20+
useBuildNavigationController
21+
} from "@firecms/core";
22+
import {
23+
FirebaseAuthController,
24+
FirebaseSignInProvider,
25+
FirebaseUserWrapper,
26+
useFirebaseAuthController,
27+
useFirebaseStorageSource,
28+
useInitialiseFirebase,
29+
} from "@firecms/firebase";
30+
import { useDataEnhancementPlugin } from "@firecms/data_enhancement";
31+
import { useImportPlugin } from "@firecms/data_import";
32+
import { useExportPlugin } from "@firecms/data_export";
33+
import { userManagementAdminViews } from "@firecms/user_management";
34+
import { booksCollection } from "./books_collection";
35+
import { useFirestoreCollectionsConfigController } from "@firecms/collection_editor_firebase";
36+
import { mergeCollections, useCollectionEditorPlugin } from "@firecms/collection_editor";
37+
import { WebSocketDataSource } from "./datasource/WebSocketDataSource";
38+
39+
export const firebaseConfig = {
40+
apiKey: "AIzaSyBzt-JvcXvpDrdNU7jYX3fC3v0EAHjTKEw",
41+
authDomain: "demo.firecms.co",
42+
databaseURL: "https://firecms-demo-27150.firebaseio.com",
43+
projectId: "firecms-demo-27150",
44+
storageBucket: "firecms-demo-27150.appspot.com",
45+
messagingSenderId: "837544933711",
46+
appId: "1:837544933711:web:75822ffc0840e3ae01ad3a",
47+
measurementId: "G-8HRE8MVXZJ"
48+
};
49+
50+
function GraphQLApp() {
51+
52+
// Use your own authentication logic here
53+
const myAuthenticator: Authenticator<FirebaseUserWrapper> = useCallback(async ({
54+
user,
55+
authController
56+
}) => {
57+
58+
if (user?.email?.includes("flanders")) {
59+
throw Error("Stupid Flanders!");
60+
}
61+
62+
// This is an example of retrieving async data related to the user
63+
// and storing it in the controller's extra field
64+
const idTokenResult = await user?.firebaseUser?.getIdTokenResult();
65+
const userIsAdmin = idTokenResult?.claims.admin || user?.email?.endsWith("@firecms.co");
66+
67+
console.log("Allowing access to", user);
68+
return Boolean(userIsAdmin);
69+
}, []);
70+
71+
const {
72+
firebaseApp,
73+
firebaseConfigLoading,
74+
configError
75+
} = useInitialiseFirebase({
76+
firebaseConfig
77+
});
78+
79+
// Controller used to manage the dark or light color mode
80+
const modeController = useBuildModeController();
81+
82+
const signInOptions: FirebaseSignInProvider[] = ["google.com"];
83+
84+
// Controller for saving some user preferences locally.
85+
const userConfigPersistence = useBuildLocalConfigurationPersistence();
86+
87+
// Delegate used for fetching and saving data in Firestore
88+
// const datasourceDelegate = useMemo(() => new GraphQLDataSource(), []);
89+
const datasourceDelegate: DataSourceDelegate = useMemo(() => new WebSocketDataSource("ws://localhost:4000"), []);
90+
91+
// Controller used for saving and fetching files in storage
92+
const storageSource = useFirebaseStorageSource({
93+
firebaseApp
94+
});
95+
96+
const collectionConfigController = useFirestoreCollectionsConfigController({
97+
firebaseApp
98+
});
99+
100+
// Controller for managing authentication
101+
const authController: FirebaseAuthController = useFirebaseAuthController({
102+
firebaseApp,
103+
signInOptions
104+
});
105+
106+
const collectionsBuilder = useCallback(() => {
107+
const collections = [
108+
booksCollection,
109+
// Your collections here
110+
];
111+
return mergeCollections(collections, collectionConfigController.collections ?? []);
112+
}, [collectionConfigController.collections]);
113+
114+
const navigationController = useBuildNavigationController({
115+
collections: collectionsBuilder,
116+
adminViews: userManagementAdminViews,
117+
authController,
118+
dataSourceDelegate: datasourceDelegate
119+
});
120+
121+
const dataEnhancementPlugin = useDataEnhancementPlugin({
122+
getConfigForPath: ({ path }) => {
123+
if (path === "books")
124+
return true;
125+
return false;
126+
}
127+
});
128+
129+
const importPlugin = useImportPlugin();
130+
const exportPlugin = useExportPlugin();
131+
132+
const collectionEditorPlugin = useCollectionEditorPlugin({
133+
collectionConfigController
134+
});
135+
136+
if (firebaseConfigLoading || !firebaseApp) {
137+
return <CircularProgressCenter/>;
138+
}
139+
140+
if (configError) {
141+
return <>{configError}</>;
142+
}
143+
return (
144+
<SnackbarProvider>
145+
<ModeControllerProvider value={modeController}>
146+
<FireCMS
147+
navigationController={navigationController}
148+
authController={authController}
149+
userConfigPersistence={userConfigPersistence}
150+
dataSourceDelegate={datasourceDelegate}
151+
storageSource={storageSource}
152+
plugins={[dataEnhancementPlugin, importPlugin, exportPlugin, collectionEditorPlugin]}
153+
>
154+
{({
155+
context,
156+
loading
157+
}) => {
158+
159+
if (loading) {
160+
return <CircularProgressCenter size={"large"}/>;
161+
}
162+
163+
return <Scaffold
164+
autoOpenDrawer={false}>
165+
<AppBar title={"My demo app"}/>
166+
<Drawer/>
167+
<NavigationRoutes/>
168+
<SideDialogs/>
169+
</Scaffold>;
170+
}}
171+
</FireCMS>
172+
</ModeControllerProvider>
173+
</SnackbarProvider>
174+
);
175+
176+
}
177+
178+
export default GraphQLApp;

0 commit comments

Comments
 (0)