@@ -11,6 +11,13 @@ import { useSettings } from '../../helpers/AppSettings';
1111import { newURL } from '../../helpers/navigation' ;
1212import { useCreateAndNavigate } from './useCreateAndNavigate' ;
1313
14+ /**
15+ * Returns a function that can be used to create a new instance of the given Class.
16+ * This is the place where you can add custom behavior for certain classes.
17+ * By default, we're redirected to an empty Form for the new instance.
18+ * For some Classes, though, we'd rather have some values are pre-filled (e.g. a new ChatRoom with a `new chatroom` title).
19+ * For others, we want to render a custom form, perhaps with a different layout.
20+ */
1421export function useDefaultNewInstanceHandler ( klass : string , parent ?: string ) {
1522 const store = useStore ( ) ;
1623 const { setDrive } = useSettings ( ) ;
@@ -22,61 +29,77 @@ export function useDefaultNewInstanceHandler(klass: string, parent?: string) {
2229 const createResourceAndNavigate = useCreateAndNavigate ( klass , parent ) ;
2330
2431 const onClick = useCallback ( async ( ) => {
25- switch ( klass ) {
26- case classes . chatRoom : {
27- createResourceAndNavigate ( 'chatRoom' , {
28- [ properties . name ] : 'New ChatRoom' ,
29- [ properties . isA ] : [ classes . chatRoom ] ,
30- } ) ;
31- break ;
32- }
33-
34- case classes . document : {
35- createResourceAndNavigate ( 'documents' , {
36- [ properties . isA ] : [ classes . document ] ,
37- [ properties . name ] : 'Untitled Document' ,
38- } ) ;
39- break ;
40- }
32+ try {
33+ switch ( klass ) {
34+ case classes . chatRoom : {
35+ createResourceAndNavigate ( 'chatRoom' , {
36+ [ properties . name ] : 'Untitled ChatRoom' ,
37+ [ properties . isA ] : [ classes . chatRoom ] ,
38+ } ) ;
39+ break ;
40+ }
4141
42- case classes . importer : {
43- createResourceAndNavigate ( 'importer' , {
44- [ properties . isA ] : [ classes . importer ] ,
45- } ) ;
46- break ;
47- }
42+ case classes . document : {
43+ createResourceAndNavigate ( 'document' , {
44+ [ properties . isA ] : [ classes . document ] ,
45+ [ properties . name ] : 'Untitled Document' ,
46+ } ) ;
47+ break ;
48+ }
4849
49- case classes . drive : {
50- const agent = store . getAgent ( ) ;
50+ case classes . folder : {
51+ createResourceAndNavigate ( 'folder' , {
52+ [ properties . isA ] : [ classes . folder ] ,
53+ [ properties . name ] : 'Untitled Folder' ,
54+ [ properties . displayStyle ] : classes . displayStyles . list ,
55+ } ) ;
56+ break ;
57+ }
5158
52- if ( ! agent || agent . subject === undefined ) {
53- throw new Error (
54- 'No agent set in the Store, required when creating a Drive' ,
55- ) ;
59+ case classes . importer : {
60+ createResourceAndNavigate ( 'importer' , {
61+ [ properties . isA ] : [ classes . importer ] ,
62+ } ) ;
63+ break ;
5664 }
5765
58- const newResource = await createResourceAndNavigate (
59- 'drive' ,
60- {
61- [ properties . isA ] : [ classes . drive ] ,
62- [ properties . write ] : [ agent . subject ] ,
63- [ properties . read ] : [ agent . subject ] ,
64- } ,
65- undefined ,
66- true ,
67- ) ;
66+ case classes . drive : {
67+ const agent = store . getAgent ( ) ;
6868
69- const agentResource = await store . getResourceAsync ( agent . subject ) ;
70- agentResource . pushPropVal ( properties . drives , newResource . getSubject ( ) ) ;
71- agentResource . save ( store ) ;
72- setDrive ( newResource . getSubject ( ) ) ;
73- break ;
74- }
69+ if ( ! agent || agent . subject === undefined ) {
70+ throw new Error (
71+ 'No agent set in the Store, required when creating a Drive' ,
72+ ) ;
73+ }
74+
75+ const newResource = await createResourceAndNavigate (
76+ 'drive' ,
77+ {
78+ [ properties . isA ] : [ classes . drive ] ,
79+ [ properties . write ] : [ agent . subject ] ,
80+ [ properties . read ] : [ agent . subject ] ,
81+ } ,
82+ undefined ,
83+ true ,
84+ ) ;
7585
76- default : {
77- // Opens an `Edit` form with the class and a decent subject name
78- navigate ( newURL ( klass , parent , store . createSubject ( shortname ) ) ) ;
86+ const agentResource = await store . getResourceAsync ( agent . subject ) ;
87+ agentResource . pushPropVal (
88+ properties . drives ,
89+ newResource . getSubject ( ) ,
90+ ) ;
91+ agentResource . save ( store ) ;
92+ setDrive ( newResource . getSubject ( ) ) ;
93+ break ;
94+ }
95+
96+ default : {
97+ // Opens an `Edit` form with the class and a decent subject name
98+ navigate ( newURL ( klass , parent , store . createSubject ( shortname ) ) ) ;
99+ }
79100 }
101+ } catch ( e ) {
102+ store . handleError ( e ) ;
80103 }
81104 } , [ klass , store , parent , createResourceAndNavigate ] ) ;
82105
0 commit comments