Skip to content

Commit 298466b

Browse files
committed
feat: url paths on file manager
1 parent 4c5d081 commit 298466b

6 files changed

Lines changed: 162 additions & 23 deletions

File tree

TelegramDownloader/Pages/Partials/impl/FileManagerImpl.razor

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
OnStrm="OnMobileStrmAsync"
9696
OnPreloadFiles="OnMobilePreloadFilesAsync"
9797
CanAddToPlaylist="true"
98-
OnAddToPlaylist="OnMobileAddToPlaylistAsync" />
98+
OnAddToPlaylist="OnMobileAddToPlaylistAsync"
99+
OnPathChanged="OnMobilePathChanged" />
99100
</div>
100101
}
101102

@@ -217,6 +218,48 @@
217218
{
218219
_viewportDetected = true;
219220
StateHasChanged();
221+
222+
// After viewport is detected, navigate to path from URL if present
223+
await NavigateToPathFromUrl();
224+
}
225+
}
226+
227+
private async Task NavigateToPathFromUrl()
228+
{
229+
try
230+
{
231+
var uri = new Uri(MyNavigationManager.Uri);
232+
var query = System.Web.HttpUtility.ParseQueryString(uri.Query);
233+
var pathFromUrl = query["path"];
234+
235+
if (!string.IsNullOrEmpty(pathFromUrl) && mobileFileManager != null)
236+
{
237+
// Decode the path and ensure it ends with /
238+
var decodedPath = Uri.UnescapeDataString(pathFromUrl);
239+
if (!decodedPath.EndsWith("/"))
240+
decodedPath += "/";
241+
242+
await mobileFileManager.NavigateToPathSilent(decodedPath);
243+
}
244+
}
245+
catch (Exception ex)
246+
{
247+
Logger.LogError(ex, "Error navigating to path from URL");
248+
}
249+
}
250+
251+
private void OnMobilePathChanged(string path)
252+
{
253+
try
254+
{
255+
// Update URL without triggering navigation
256+
var baseUri = MyNavigationManager.Uri.Split('?')[0];
257+
var newUrl = path == "/" ? baseUri : $"{baseUri}?path={Uri.EscapeDataString(path)}";
258+
MyNavigationManager.NavigateTo(newUrl, forceLoad: false, replace: true);
259+
}
260+
catch (Exception ex)
261+
{
262+
Logger.LogError(ex, "Error updating URL with path");
220263
}
221264
}
222265

TelegramDownloader/Pages/Partials/impl/LocalFileManagerImpl.razor

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
@using TelegramDownloader.Data
1+
@using System.Web
2+
@using TelegramDownloader.Data
23
@using TelegramDownloader.Models
34
@using TelegramDownloader.Pages.Modals
45
@using TelegramDownloader.Pages.Modals.InfoModals
@@ -65,7 +66,8 @@
6566
OnUploadToLocal="OnMobileUploadToLocalAsync"
6667
OnUrlMedia="OnMobileUrlMediaAsync"
6768
CanAddToPlaylist="true"
68-
OnAddToPlaylist="OnMobileAddToPlaylistAsync" />
69+
OnAddToPlaylist="OnMobileAddToPlaylistAsync"
70+
OnPathChanged="OnMobilePathChanged" />
6971
</div>
7072
}
7173

@@ -203,6 +205,48 @@
203205
{
204206
_viewportDetected = true;
205207
StateHasChanged();
208+
209+
// After viewport is detected, navigate to path from URL if present
210+
await NavigateToPathFromUrl();
211+
}
212+
}
213+
214+
private async Task NavigateToPathFromUrl()
215+
{
216+
try
217+
{
218+
var uri = new Uri(MyNavigationManager.Uri);
219+
var query = HttpUtility.ParseQueryString(uri.Query);
220+
var pathFromUrl = query["path"];
221+
222+
if (!string.IsNullOrEmpty(pathFromUrl) && mobileFileManager != null)
223+
{
224+
// Decode the path and ensure it ends with /
225+
var decodedPath = Uri.UnescapeDataString(pathFromUrl);
226+
if (!decodedPath.EndsWith("/"))
227+
decodedPath += "/";
228+
229+
await mobileFileManager.NavigateToPathSilent(decodedPath);
230+
}
231+
}
232+
catch (Exception ex)
233+
{
234+
Logger.LogError(ex, "Error navigating to path from URL");
235+
}
236+
}
237+
238+
private void OnMobilePathChanged(string path)
239+
{
240+
try
241+
{
242+
// Update URL without triggering navigation
243+
var baseUri = MyNavigationManager.Uri.Split('?')[0];
244+
var newUrl = path == "/" ? baseUri : $"{baseUri}?path={Uri.EscapeDataString(path)}";
245+
MyNavigationManager.NavigateTo(newUrl, forceLoad: false, replace: true);
246+
}
247+
catch (Exception ex)
248+
{
249+
Logger.LogError(ex, "Error updating URL with path");
206250
}
207251
}
208252

TelegramDownloader/Shared/MainLayout.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
<main>
7676
<div class="top-row px-3">
7777
<button class="sidebar-toggle" @onclick="ToggleSidebar" title="@(sidebarCollapsed ? "Show sidebar" : "Hide sidebar")">
78-
<i class="bi @(sidebarCollapsed ? "bi-list" : "bi-x-lg")"></i>
78+
<i class="bi @(sidebarCollapsed ? "bi-chevron-right" : "bi-chevron-left")"></i>
7979
</button>
8080

8181
<div class="flex-grow-1"></div>

TelegramDownloader/Shared/MainLayout.razor.css

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,26 +43,39 @@ main {
4343

4444
/* Sidebar toggle button */
4545
.top-row ::deep .sidebar-toggle {
46-
width: 40px;
47-
height: 40px;
48-
border-radius: 0.5rem;
46+
width: 36px;
47+
height: 36px;
48+
border-radius: 50%;
4949
display: flex;
5050
align-items: center;
5151
justify-content: center;
52-
color: rgba(255, 255, 255, 0.7);
53-
background: rgba(255, 255, 255, 0.05);
54-
border: 1px solid rgba(255, 255, 255, 0.1);
55-
transition: all 0.2s ease;
52+
color: rgba(255, 255, 255, 0.85);
53+
background: linear-gradient(135deg, rgba(233, 69, 96, 0.8) 0%, rgba(233, 69, 96, 0.6) 100%);
54+
border: none;
55+
box-shadow: 0 2px 8px rgba(233, 69, 96, 0.3);
56+
cursor: pointer;
57+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
5658
}
5759

5860
.top-row ::deep .sidebar-toggle:hover {
59-
background: rgba(255, 255, 255, 0.1);
61+
background: linear-gradient(135deg, rgba(233, 69, 96, 1) 0%, rgba(233, 69, 96, 0.8) 100%);
6062
color: #fff;
61-
transform: scale(1.05);
63+
transform: scale(1.1);
64+
box-shadow: 0 4px 16px rgba(233, 69, 96, 0.4);
65+
}
66+
67+
.top-row ::deep .sidebar-toggle:active {
68+
transform: scale(0.95);
69+
box-shadow: 0 2px 4px rgba(233, 69, 96, 0.3);
6270
}
6371

6472
.top-row ::deep .sidebar-toggle i {
65-
font-size: 1.25rem;
73+
font-size: 1.1rem;
74+
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
75+
}
76+
77+
.top-row ::deep .sidebar-toggle:hover i {
78+
transform: translateX(-3px);
6679
}
6780

6881
/* Action buttons group */

TelegramDownloader/Shared/MobileFileManager/MobileFileManager.razor.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ public partial class MobileFileManager : ComponentBase
118118
[Parameter]
119119
public EventCallback<MfmAddToPlaylistEventArgs> OnAddToPlaylist { get; set; }
120120

121+
[Parameter]
122+
public EventCallback<string> OnPathChanged { get; set; }
123+
121124
#endregion
122125

123126
#region State
@@ -395,6 +398,7 @@ private async Task NavigateToPath(string path)
395398
ClearSelection();
396399
ResetPagination();
397400
await LoadFiles();
401+
await OnPathChanged.InvokeAsync(CurrentPath);
398402
}
399403

400404
private async Task GoBack()
@@ -427,6 +431,7 @@ private async Task GoBack()
427431
ClearSelection();
428432
ResetPagination();
429433
await LoadFiles();
434+
await OnPathChanged.InvokeAsync(CurrentPath);
430435
}
431436

432437
private async Task OnFileClick(FileManagerDirectoryContent file)
@@ -467,6 +472,7 @@ private async Task NavigateToFolder(FileManagerDirectoryContent folder)
467472
ClearSelection();
468473
ResetPagination();
469474
await LoadFiles();
475+
await OnPathChanged.InvokeAsync(CurrentPath);
470476
}
471477

472478
private async Task OpenFile(FileManagerDirectoryContent file)
@@ -1297,6 +1303,21 @@ public string Path
12971303
set => CurrentPath = value;
12981304
}
12991305

1306+
/// <summary>
1307+
/// Navigates to the specified path without triggering OnPathChanged event.
1308+
/// Useful when initializing from URL to avoid infinite loops.
1309+
/// </summary>
1310+
public async Task NavigateToPathSilent(string path)
1311+
{
1312+
if (string.IsNullOrEmpty(path) || path == CurrentPath)
1313+
return;
1314+
1315+
CurrentPath = NormalizePath(path);
1316+
ClearSelection();
1317+
ResetPagination();
1318+
await LoadFiles();
1319+
}
1320+
13001321
#endregion
13011322

13021323
private class PathSegment

TelegramDownloader/Shared/NavMenu.razor

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,39 @@
4848
}
4949
5050
.sidebar-toggler {
51-
background: rgba(255,255,255,0.1);
52-
border: none;
53-
color: white;
54-
width: 36px;
55-
height: 36px;
56-
border-radius: 0.5rem;
51+
width: 34px;
52+
height: 34px;
53+
border-radius: 50%;
5754
display: flex;
5855
align-items: center;
5956
justify-content: center;
57+
color: rgba(255, 255, 255, 0.85);
58+
background: linear-gradient(135deg, rgba(233, 69, 96, 0.8) 0%, rgba(233, 69, 96, 0.6) 100%);
59+
border: none;
60+
box-shadow: 0 2px 8px rgba(233, 69, 96, 0.3);
6061
cursor: pointer;
61-
transition: all 0.2s ease;
62+
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
63+
}
64+
65+
.sidebar-toggler i {
66+
font-size: 1rem;
67+
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
6268
}
6369
6470
.sidebar-toggler:hover {
65-
background: rgba(233, 69, 96, 0.3);
71+
background: linear-gradient(135deg, rgba(233, 69, 96, 1) 0%, rgba(233, 69, 96, 0.8) 100%);
72+
color: #fff;
73+
transform: scale(1.1);
74+
box-shadow: 0 4px 16px rgba(233, 69, 96, 0.4);
75+
}
76+
77+
.sidebar-toggler:active {
78+
transform: scale(0.95);
79+
box-shadow: 0 2px 4px rgba(233, 69, 96, 0.3);
80+
}
81+
82+
.sidebar-toggler:hover i {
83+
transform: translateY(-2px);
6684
}
6785
6886
/* Collapse behavior */
@@ -408,7 +426,7 @@
408426
<span>TelegramFileManager</span>
409427
</a>
410428
<button class="sidebar-toggler" @onclick="ToggleNavMenu" title="Toggle menu">
411-
<i class="bi @(collapseNavMenu ? "bi-list" : "bi-x-lg")"></i>
429+
<i class="bi @(collapseNavMenu ? "bi-chevron-down" : "bi-chevron-up")"></i>
412430
</button>
413431
</div>
414432

0 commit comments

Comments
 (0)