Skip to content

Commit 6c539f9

Browse files
committed
Added support for CSR for URL preview
1 parent 4854c0a commit 6c539f9

File tree

15 files changed

+119
-57
lines changed

15 files changed

+119
-57
lines changed

ClipboardCanvas/CanavsPasteModels/BasePasteModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ protected async Task<SafeWrapperResult> SaveDataToFileInternal()
149149
if (IsContentAsReference && await sourceItem == null)
150150
{
151151
// We need to update the reference file because the one we created is empty
152-
ReferenceFile referenceFile = await ReferenceFile.GetFile(associatedFile);
153-
return await referenceFile.UpdateReference(new ReferenceFileData(_pastedItem.Path));
152+
ReferenceFile referenceFile = await ReferenceFile.GetReferenceFile(associatedFile);
153+
return await referenceFile.UpdateReference(_pastedItem.Path);
154154
}
155155
else
156156
{

ClipboardCanvas/DataModels/CanvasItem.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ protected virtual async Task<IStorageItem> GetSourceItem()
4848

4949
if (AssociatedItem is StorageFile file && ReferenceFile.IsReferenceFile(file))
5050
{
51-
ReferenceFile referenceFile = await ReferenceFile.GetFile(file);
51+
ReferenceFile referenceFile = await ReferenceFile.GetReferenceFile(file);
5252
sourceItem = referenceFile.ReferencedItem;
5353
}
5454
else

ClipboardCanvas/DataModels/ContentDataModels/BaseContentTypeModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public static async Task<BaseContentTypeModel> GetContentType(IStorageItem item,
8585
if (ReferenceFile.IsReferenceFile(file))
8686
{
8787
// Reference File, get the destination file extension
88-
ReferenceFile referenceFile = await ReferenceFile.GetFile(file);
88+
ReferenceFile referenceFile = await ReferenceFile.GetReferenceFile(file);
8989

9090
if (referenceFile.ReferencedItem == null)
9191
{

ClipboardCanvas/Helpers/SafetyHelpers/SafeWrapperResult.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,22 @@ public static SafeWrapperResult FromException(Exception exception, ISafeWrapperE
5050
return exceptionReporter.GetStatusResult(exception);
5151
}
5252

53-
public static implicit operator OperationErrorCode(SafeWrapperResult wrapperResult) => wrapperResult?.Details?.errorCode ?? OperationErrorCode.InvalidArgument;
53+
public static implicit operator OperationErrorCode(SafeWrapperResult wrapperResult)
54+
=> wrapperResult?.Details?.errorCode ?? OperationErrorCode.InvalidArgument;
5455

55-
public static implicit operator bool(SafeWrapperResult wrapperResult) => wrapperResult?.Details?.errorCode == OperationErrorCode.Success;
56+
public static implicit operator bool(SafeWrapperResult wrapperResult)
57+
=> (wrapperResult?.Details?.errorCode ?? OperationErrorCode.UnknownFailed) == OperationErrorCode.Success;
5658

57-
public static implicit operator SafeWrapperResult(SafeWrapperResultDetails details) => new SafeWrapperResult(details);
59+
public static implicit operator SafeWrapperResult(SafeWrapperResultDetails details)
60+
=> new SafeWrapperResult(details);
5861

5962
public static implicit operator SafeWrapperResult((OperationErrorCode errorCode, Exception innerException) details)
60-
=> new SafeWrapperResultDetails(details.errorCode, details.innerException);
63+
=> new SafeWrapperResult(details.errorCode, details.innerException);
6164

6265
public static implicit operator SafeWrapperResult((OperationErrorCode errorCode, string message) details)
63-
=> new SafeWrapperResultDetails(details.errorCode, details.message);
66+
=> new SafeWrapperResult(details.errorCode, details.message);
6467

6568
public static implicit operator SafeWrapperResult((OperationErrorCode errorCode, Exception innerException, string message) details)
66-
=> new SafeWrapperResultDetails(details.errorCode, details.innerException, details.message);
69+
=> new SafeWrapperResult(details.errorCode, details.innerException, details.message);
6770
}
6871
}

ClipboardCanvas/Helpers/WebHelpers.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ public static bool IsUrl(string str)
3030

3131
public static bool IsUrlFile(string url)
3232
{
33-
if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri) && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))
33+
if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri) && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps) && uri.IsFile)
3434
{
35-
return Path.HasExtension(url);
35+
return true;
3636
}
3737

3838
return false;
@@ -45,7 +45,7 @@ public static async Task<bool> IsValidUrl(string url)
4545
return false;
4646
}
4747

48-
WebResponse response;
48+
WebResponse response = null;
4949
try
5050
{
5151
WebRequest request = WebRequest.Create(url);
@@ -66,6 +66,10 @@ public static async Task<bool> IsValidUrl(string url)
6666
{
6767
return false;
6868
}
69+
finally
70+
{
71+
response?.Dispose();
72+
}
6973

7074
return true;
7175
}
@@ -207,7 +211,7 @@ public static async Task<string> FormatImageUrl(string rawImageUrl, string url)
207211
if (!string.IsNullOrEmpty(rawImageUrl))
208212
{
209213
string formattedUrl;
210-
214+
211215
if (!rawImageUrl.Contains("http"))
212216
{
213217
string baseUrl;
@@ -223,15 +227,24 @@ public static async Task<string> FormatImageUrl(string rawImageUrl, string url)
223227
http = "http://";
224228
}
225229

226-
var uri = new Uri(url);
227-
baseUrl = $"{http}{uri.Host}";
230+
Uri rawImageUri = new Uri(rawImageUrl);
231+
if (!string.IsNullOrEmpty(rawImageUri.Host))
232+
{
233+
baseUrl = $"{http}{rawImageUri.Host}";
234+
rawImageUrl = rawImageUrl.Replace(rawImageUri.Host, string.Empty);
235+
}
236+
else
237+
{
238+
Uri uri = new Uri(url);
239+
baseUrl = $"{http}{uri.Host}";
240+
}
228241
}
229242
else
230243
{
231244
baseUrl = url;
232245
}
233246

234-
formattedUrl = ($"{baseUrl}/{rawImageUrl}").PreventNull(string.Empty).Replace("///", "/").Replace("//", "/").Replace("https:/", "https://");
247+
formattedUrl = ($"{baseUrl}/{rawImageUrl}").PreventNull(string.Empty).Replace("///", "/").Replace("//", "/").Replace(":/", "://");
235248
}
236249
else
237250
{

ClipboardCanvas/Pages/HomePage.xaml.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using Windows.UI.Xaml.Navigation;
33

44
using ClipboardCanvas.ViewModels.Pages;
5+
using ClipboardCanvas.ViewModels.Widgets.Timeline;
6+
using System.Threading;
57

68
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
79

@@ -20,6 +22,10 @@ public HomePageViewModel ViewModel
2022

2123
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
2224
{
25+
TimelineWidgetViewModel.LoadCancellationToken.Cancel();
26+
TimelineWidgetViewModel.LoadCancellationToken.Dispose();
27+
TimelineWidgetViewModel.LoadCancellationToken = new CancellationTokenSource();
28+
2329
CollectionsWidget.ViewModel.Dispose();
2430
this.ViewModel.Dispose();
2531

ClipboardCanvas/ReferenceItems/ReferenceFile.cs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
using ClipboardCanvas.Enums;
1+
using Newtonsoft.Json;
2+
using System.IO;
3+
using System.Threading.Tasks;
4+
using Windows.Storage;
5+
6+
using ClipboardCanvas.Enums;
27
using ClipboardCanvas.Exceptions;
38
using ClipboardCanvas.Helpers.Filesystem;
49
using ClipboardCanvas.Helpers.SafetyHelpers;
5-
using Newtonsoft.Json;
610
using System;
7-
using System.IO;
8-
using System.Threading.Tasks;
9-
using Windows.Storage;
1011

1112
namespace ClipboardCanvas.ReferenceItems
1213
{
@@ -17,47 +18,46 @@ public sealed class ReferenceFile
1718
{
1819
private readonly StorageFile _innerReferenceFile;
1920

21+
private ReferenceFileData _referenceFileData;
22+
2023
public SafeWrapperResult LastError { get; private set; } = SafeWrapperResult.SUCCESS;
2124

2225
public IStorageItem ReferencedItem { get; private set; }
2326

24-
public ReferenceFileData ReferenceFileData { get; private set; }
25-
2627
private ReferenceFile(StorageFile innerFile, IStorageItem referencedItem)
2728
{
2829
this._innerReferenceFile = innerFile;
2930
this.ReferencedItem = referencedItem;
3031
}
3132

32-
public async Task<SafeWrapperResult> UpdateReference(ReferenceFileData referenceFileData)
33+
public async Task<SafeWrapperResult> UpdateReference(string newPath)
3334
{
34-
string serialized = JsonConvert.SerializeObject(referenceFileData, Formatting.Indented);
35-
SafeWrapperResult result = await FilesystemOperations.WriteFileText(_innerReferenceFile, serialized);
35+
_referenceFileData = new ReferenceFileData(newPath);
36+
string serialized = JsonConvert.SerializeObject(_referenceFileData, Formatting.Indented);
3637

37-
return result;
38+
return await FilesystemOperations.WriteFileText(_innerReferenceFile, serialized);
3839
}
3940

4041
private static async Task<SafeWrapper<ReferenceFileData>> ReadData(StorageFile referenceFile)
4142
{
4243
SafeWrapper<string> data = await FilesystemOperations.ReadFileText(referenceFile);
43-
4444
if (!data)
4545
{
46-
return new SafeWrapper<ReferenceFileData>(null, data.Details);
46+
return (null, data.Details);
4747
}
4848

4949
ReferenceFileData referenceFileData = JsonConvert.DeserializeObject<ReferenceFileData>(data);
50-
51-
return new SafeWrapper<ReferenceFileData>(referenceFileData, SafeWrapperResult.SUCCESS);
50+
return (referenceFileData, SafeWrapperResult.SUCCESS);
5251
}
5352

54-
public static async Task<ReferenceFile> GetFile(StorageFile referenceFile)
53+
public static async Task<ReferenceFile> GetReferenceFile(StorageFile referenceFile)
5554
{
5655
// The file is not a Reference File
5756
if (!IsReferenceFile(referenceFile))
5857
{
5958
return null;
6059
}
60+
6161
// The file does not exist
6262
if (!StorageHelpers.Existsh(referenceFile.Path))
6363
{
@@ -74,13 +74,20 @@ public static async Task<ReferenceFile> GetFile(StorageFile referenceFile)
7474

7575
private static async Task<ReferenceFile> GetFile(StorageFile referenceFile, SafeWrapper<ReferenceFileData> referenceFileData)
7676
{
77-
if (!referenceFileData || string.IsNullOrEmpty(referenceFileData.Result?.path))
77+
if (!referenceFileData)
7878
{
7979
return new ReferenceFile(referenceFile, null)
8080
{
8181
LastError = referenceFileData
8282
};
8383
}
84+
else if (string.IsNullOrEmpty(referenceFileData?.Result?.path))
85+
{
86+
return new ReferenceFile(referenceFile, null)
87+
{
88+
LastError = new SafeWrapperResult(OperationErrorCode.InvalidArgument, new NullReferenceException(), "Reference File path is null.")
89+
};
90+
}
8491

8592
SafeWrapper<IStorageItem> file = await StorageHelpers.ToStorageItemWithError<IStorageItem>(referenceFileData.Result.path);
8693

@@ -98,12 +105,15 @@ private static async Task<ReferenceFile> GetFile(StorageFile referenceFile, Safe
98105
{
99106
return new ReferenceFile(referenceFile, null)
100107
{
101-
LastError = (SafeWrapperResult)file
108+
LastError = file
102109
};
103110
}
104111
}
105112

106-
return new ReferenceFile(referenceFile, file.Result);
113+
return new ReferenceFile(referenceFile, file.Result)
114+
{
115+
_referenceFileData = referenceFileData.Result
116+
};
107117
}
108118

109119
public static bool IsReferenceFile(StorageFile file)

ClipboardCanvas/Services/Implementation/TimelineService.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
23

34
using ClipboardCanvas.DataModels;
45
using ClipboardCanvas.Models;
@@ -41,10 +42,13 @@ public async Task LoadSectionAsync(TimelineSectionViewModel timelineSection)
4142
return;
4243
}
4344

45+
List<Task> loadItemTasks = new List<Task>();
4446
foreach (var item in timelineSection.Items)
4547
{
46-
await item.InitializeSectionItemContent();
48+
loadItemTasks.Add(item.InitializeSectionItemContent());
4749
}
50+
51+
await Task.WhenAll(loadItemTasks);
4852
}
4953

5054
public async Task LoadAllSectionsAsync()
@@ -54,10 +58,13 @@ public async Task LoadAllSectionsAsync()
5458
return;
5559
}
5660

61+
List<Task> loadItemTasks = new List<Task>();
5762
foreach (var item in TimelineWidgetViewModel.Sections)
5863
{
59-
await LoadSectionAsync(item);
64+
loadItemTasks.Add(LoadSectionAsync(item));
6065
}
66+
67+
await Task.WhenAll(loadItemTasks);
6168
}
6269

6370
public void UnloadSection(TimelineSectionViewModel timelineSection)

ClipboardCanvas/UserControls/InteractableCanvasControl.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@
9090
x:Name="PastedAsReferenceButton"
9191
Grid.Row="1"
9292
Grid.Column="0"
93-
Width="30"
94-
Height="30"
93+
Width="32"
94+
Height="32"
9595
Margin="0,0,0,-4"
9696
Padding="0"
9797
HorizontalAlignment="Left"

ClipboardCanvas/UserControls/InteractableCanvasControl.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ private void Canvas_Drop(object sender, DragEventArgs e)
9292
element.Opacity = 1.0d;
9393

9494
// Update the ZIndex of the element - set it on top
95-
SetOnTop(container);
95+
SetOnTop(container); // TODO: Fix this - sometimes other item can shown higher
9696

9797
this.ViewModel.ItemRearranged();
9898
}

0 commit comments

Comments
 (0)