@@ -93,122 +93,11 @@ class _FilesPagePageState extends State<FilesPage>
9393 onRefresh: () async =>
9494 refresh (context, stateL: stateL, state: state),
9595 child: state.folderState == FolderState .home
96- ? SafeArea (
97- child: CustomScrollView (
98- slivers: state.courses
99- .groupBy (
100- (c) => c
101- .relationship ('start-semester' )
102- .first
103- .id,
104- )
105- .map (
106- (s, cs) => MapEntry (
107- state.semesters.firstWhere (
108- (se) => se.id == s,
109- ),
110- cs,
111- ),
112- )
113- .entries
114- .sortedBy ((e) => e.key.attributes.start)
115- .reversed
116- .map (
117- (e) => SliverStickyHeader (
118- header: Container (
119- height: 60 ,
120- color: Colors .lightBlue,
121- padding: const EdgeInsets .symmetric (
122- horizontal: 16 ,
123- ),
124- alignment: Alignment .centerLeft,
125- child: Text (
126- e.key.attributes.title,
127- style: const TextStyle (
128- color: Colors .white,
129- ),
130- ),
131- ),
132- sliver: SliverList (
133- delegate: SliverChildListDelegate .fixed (
134- e.value
135- .map (
136- (c) => CourseWidget (
137- course: c,
138- onTap: () async {
139- await loadCourse (c);
140- },
141- ),
142- )
143- .sortedByCompare (
144- (f) => f.sortKey,
145- compareNatural,
146- )
147- .toList (growable: false ),
148- ),
149- ),
150- ),
151- )
152- .toList (growable: false ),
153- ),
154- )
155- : ListView (
156- children:
157- < Widget > [
158- FolderWidget (
159- folder: goUpFolder (),
160- onTap: () async {
161- state.goUp ();
162- await refresh (
163- context,
164- stateL: stateL,
165- state: state,
166- );
167- },
168- ),
169- ] +
170- state.folders
171- .map (
172- (f) => FolderWidget (
173- folder: f,
174- onTap: () async {
175- await loadFolder (f);
176- },
177- ),
178- )
179- .sortedByCompare (
180- (f) => f.sortKey,
181- compareNatural,
182- )
183- .toList (growable: false ) +
184- state.files
185- .map (
186- (f) => FileWidget (
187- file: f,
188- onTap: () async {
189- final pd = ProgressDialog (
190- context: context,
191- );
192- unawaited (
193- pd.show (
194- msg: context.i18n.downloading,
195- ),
196- );
197- await downloadFile (
198- f,
199- onProgress: (perc) =>
200- pd.update (value: perc.round ()),
201- onDone: OpenFilex .open,
202- );
203- },
204- showDownloads: isWideScreen,
205- ),
206- )
207- .sortedByCompare (
208- (f) => f.sortKey,
209- compareNatural,
210- )
211- .toList (growable: false ),
96+ ? generateHomeList (context, state: state)
97+ : generateFolderList (
98+ context,
99+ stateL: stateL,
100+ state: state,
212101 ),
213102 ),
214103 );
@@ -217,6 +106,99 @@ class _FilesPagePageState extends State<FilesPage>
217106 ),
218107 );
219108
109+ Widget generateHomeList (BuildContext context, {required FilesState state}) =>
110+ SafeArea (
111+ child: CustomScrollView (
112+ slivers: state.courses
113+ .groupBy ((c) => c.relationship ('start-semester' ).first.id)
114+ .map (
115+ (s, cs) => MapEntry (
116+ state.semesters.firstWhere ((se) => se.id == s),
117+ cs,
118+ ),
119+ )
120+ .entries
121+ .sortedBy ((e) => e.key.attributes.start)
122+ .reversed
123+ .map (
124+ (e) => SliverStickyHeader (
125+ header: Container (
126+ height: 60 ,
127+ color: Colors .lightBlue,
128+ padding: const EdgeInsets .symmetric (horizontal: 16 ),
129+ alignment: Alignment .centerLeft,
130+ child: Text (
131+ e.key.attributes.title,
132+ style: const TextStyle (color: Colors .white),
133+ ),
134+ ),
135+ sliver: SliverList (
136+ delegate: SliverChildListDelegate .fixed (
137+ e.value
138+ .map (
139+ (c) => CourseWidget (
140+ course: c,
141+ onTap: () async {
142+ await loadCourse (c);
143+ },
144+ ),
145+ )
146+ .sortedByCompare ((f) => f.sortKey, compareNatural)
147+ .toList (growable: false ),
148+ ),
149+ ),
150+ ),
151+ )
152+ .toList (growable: false ),
153+ ),
154+ );
155+
156+ Widget generateFolderList (
157+ BuildContext context, {
158+ required LoginState stateL,
159+ required FilesState state,
160+ }) => ListView (
161+ children:
162+ < Widget > [
163+ FolderWidget (
164+ folder: goUpFolder (),
165+ onTap: () async {
166+ state.goUp ();
167+ await refresh (context, stateL: stateL, state: state);
168+ },
169+ ),
170+ ] +
171+ state.folders
172+ .map (
173+ (f) => FolderWidget (
174+ folder: f,
175+ onTap: () async {
176+ await loadFolder (f);
177+ },
178+ ),
179+ )
180+ .sortedByCompare ((f) => f.sortKey, compareNatural)
181+ .toList (growable: false ) +
182+ state.files
183+ .map (
184+ (f) => FileWidget (
185+ file: f,
186+ onTap: () async {
187+ final pd = ProgressDialog (context: context);
188+ unawaited (pd.show (msg: context.i18n.downloading));
189+ await downloadFile (
190+ f,
191+ onProgress: (perc) => pd.update (value: perc.round ()),
192+ onDone: OpenFilex .open,
193+ );
194+ },
195+ showDownloads: isWideScreen,
196+ ),
197+ )
198+ .sortedByCompare ((f) => f.sortKey, compareNatural)
199+ .toList (growable: false ),
200+ );
201+
220202 Future <String > downloadFile (
221203 FileRef file, {
222204 ProgressListener ? onProgress,
0 commit comments