Compare commits
No commits in common. "c1eb2109ed55334fba33749b4969eada3cd946e0" and "601f81dc9fa0fcd440588ce69e77b47dff121bb4" have entirely different histories.
c1eb2109ed
...
601f81dc9f
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
5D2B7FB92DFA27A400EBDB2B /* URLShare.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 5D2B7FAF2DFA27A400EBDB2B /* URLShare.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
5D2B7FB92DFA27A400EBDB2B /* URLShare.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 5D2B7FAF2DFA27A400EBDB2B /* URLShare.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
|
||||||
5D348CC32E0C9F4F00D0AF21 /* netfox in Frameworks */ = {isa = PBXBuildFile; productRef = 5D348CC22E0C9F4F00D0AF21 /* netfox */; };
|
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -134,7 +133,6 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
5D348CC32E0C9F4F00D0AF21 /* netfox in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -222,7 +220,6 @@
|
|||||||
);
|
);
|
||||||
name = readeck;
|
name = readeck;
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
5D348CC22E0C9F4F00D0AF21 /* netfox */,
|
|
||||||
);
|
);
|
||||||
productName = readeck;
|
productName = readeck;
|
||||||
productReference = 5D45F9C82DF858680048D5B8 /* readeck.app */;
|
productReference = 5D45F9C82DF858680048D5B8 /* readeck.app */;
|
||||||
@ -309,9 +306,6 @@
|
|||||||
);
|
);
|
||||||
mainGroup = 5D45F9BF2DF858680048D5B8;
|
mainGroup = 5D45F9BF2DF858680048D5B8;
|
||||||
minimizedProjectReferenceProxies = 1;
|
minimizedProjectReferenceProxies = 1;
|
||||||
packageReferences = (
|
|
||||||
5D348CC12E0C9F4F00D0AF21 /* XCRemoteSwiftPackageReference "netfox" */,
|
|
||||||
);
|
|
||||||
preferredProjectObjectVersion = 77;
|
preferredProjectObjectVersion = 77;
|
||||||
productRefGroup = 5D45F9C92DF858680048D5B8 /* Products */;
|
productRefGroup = 5D45F9C92DF858680048D5B8 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
@ -796,25 +790,6 @@
|
|||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
/* Begin XCRemoteSwiftPackageReference section */
|
|
||||||
5D348CC12E0C9F4F00D0AF21 /* XCRemoteSwiftPackageReference "netfox" */ = {
|
|
||||||
isa = XCRemoteSwiftPackageReference;
|
|
||||||
repositoryURL = "https://github.com/kasketis/netfox";
|
|
||||||
requirement = {
|
|
||||||
kind = upToNextMajorVersion;
|
|
||||||
minimumVersion = 1.21.0;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
|
||||||
5D348CC22E0C9F4F00D0AF21 /* netfox */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
package = 5D348CC12E0C9F4F00D0AF21 /* XCRemoteSwiftPackageReference "netfox" */;
|
|
||||||
productName = netfox;
|
|
||||||
};
|
|
||||||
/* End XCSwiftPackageProductDependency section */
|
|
||||||
};
|
};
|
||||||
rootObject = 5D45F9C02DF858680048D5B8 /* Project object */;
|
rootObject = 5D45F9C02DF858680048D5B8 /* Project object */;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"originHash" : "7374154e7686de69a9f88fbafb081b646b02140f8d82770f46fa750840581e0e",
|
|
||||||
"pins" : [
|
|
||||||
{
|
|
||||||
"identity" : "netfox",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/kasketis/netfox",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "557576032736fd3140422baefb68b8f76c55088f",
|
|
||||||
"version" : "1.21.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version" : 3
|
|
||||||
}
|
|
||||||
@ -3,52 +3,4 @@
|
|||||||
uuid = "FAD7B3BD-946C-4129-A614-E1823F18EC12"
|
uuid = "FAD7B3BD-946C-4129-A614-E1823F18EC12"
|
||||||
type = "1"
|
type = "1"
|
||||||
version = "2.0">
|
version = "2.0">
|
||||||
<Breakpoints>
|
|
||||||
<BreakpointProxy
|
|
||||||
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
|
||||||
<BreakpointContent
|
|
||||||
uuid = "B67988B8-09FD-461D-A5FA-7D72A318247D"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
filePath = "readeck/UI/BookmarkDetail/BookmarkDetailViewModel.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "39"
|
|
||||||
endingLineNumber = "39"
|
|
||||||
landmarkName = "loadBookmarkDetail(id:)"
|
|
||||||
landmarkType = "7">
|
|
||||||
<Locations>
|
|
||||||
<Location
|
|
||||||
uuid = "B67988B8-09FD-461D-A5FA-7D72A318247D - 5494d64ddd867e19"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
symbolName = "(6) suspend resume partial function for readeck.BookmarkDetailViewModel.loadBookmarkDetail(id: Swift.String) async -> ()"
|
|
||||||
moduleName = "readeck.debug.dylib"
|
|
||||||
usesParentBreakpointCondition = "Yes"
|
|
||||||
urlString = "file:///Users/ilyashallak/Privat/Projects/readeck/readeck/UI/BookmarkDetail/BookmarkDetailViewModel.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "39"
|
|
||||||
endingLineNumber = "39">
|
|
||||||
</Location>
|
|
||||||
<Location
|
|
||||||
uuid = "B67988B8-09FD-461D-A5FA-7D72A318247D - ac249dd33728018"
|
|
||||||
shouldBeEnabled = "Yes"
|
|
||||||
ignoreCount = "0"
|
|
||||||
continueAfterRunningActions = "No"
|
|
||||||
symbolName = "(7) suspend resume partial function for readeck.BookmarkDetailViewModel.loadBookmarkDetail(id: Swift.String) async -> ()"
|
|
||||||
moduleName = "readeck.debug.dylib"
|
|
||||||
usesParentBreakpointCondition = "Yes"
|
|
||||||
urlString = "file:///Users/ilyashallak/Privat/Projects/readeck/readeck/UI/BookmarkDetail/BookmarkDetailViewModel.swift"
|
|
||||||
startingColumnNumber = "9223372036854775807"
|
|
||||||
endingColumnNumber = "9223372036854775807"
|
|
||||||
startingLineNumber = "39"
|
|
||||||
endingLineNumber = "39">
|
|
||||||
</Location>
|
|
||||||
</Locations>
|
|
||||||
</BreakpointContent>
|
|
||||||
</BreakpointProxy>
|
|
||||||
</Breakpoints>
|
|
||||||
</Bucket>
|
</Bucket>
|
||||||
|
|||||||
@ -1,15 +1,6 @@
|
|||||||
{
|
{
|
||||||
"colors" : [
|
"colors" : [
|
||||||
{
|
{
|
||||||
"color" : {
|
|
||||||
"color-space" : "srgb",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0.831",
|
|
||||||
"green" : "0.737",
|
|
||||||
"red" : "0.200"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 785 B |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 1006 B |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.6 KiB |
@ -1,346 +1,81 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "40.png",
|
"idiom" : "universal",
|
||||||
"idiom" : "iphone",
|
"platform" : "ios",
|
||||||
"scale" : "2x",
|
"size" : "1024x1024"
|
||||||
"size" : "20x20"
|
},
|
||||||
},
|
{
|
||||||
{
|
"appearances" : [
|
||||||
"filename" : "60.png",
|
{
|
||||||
"idiom" : "iphone",
|
"appearance" : "luminosity",
|
||||||
"scale" : "3x",
|
"value" : "dark"
|
||||||
"size" : "20x20"
|
}
|
||||||
},
|
],
|
||||||
{
|
"idiom" : "universal",
|
||||||
"filename" : "29.png",
|
"platform" : "ios",
|
||||||
"idiom" : "iphone",
|
"size" : "1024x1024"
|
||||||
"scale" : "1x",
|
},
|
||||||
"size" : "29x29"
|
{
|
||||||
},
|
"appearances" : [
|
||||||
{
|
{
|
||||||
"filename" : "58.png",
|
"appearance" : "luminosity",
|
||||||
"idiom" : "iphone",
|
"value" : "tinted"
|
||||||
"scale" : "2x",
|
}
|
||||||
"size" : "29x29"
|
],
|
||||||
},
|
"idiom" : "universal",
|
||||||
{
|
"platform" : "ios",
|
||||||
"filename" : "87.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "80.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "120.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "57.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "57x57"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "114.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "57x57"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "120.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "180.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "20.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "40.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "29.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "58.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "40.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "80.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "50.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "50x50"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "100.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "50x50"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "72.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "72x72"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "144.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "72x72"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "76.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "152.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "167.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "83.5x83.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "1024.png",
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "16.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "1x",
|
"scale" : "1x",
|
||||||
"size" : "16x16"
|
"size" : "16x16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "32.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "2x",
|
"scale" : "2x",
|
||||||
"size" : "16x16"
|
"size" : "16x16"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "32.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "1x",
|
"scale" : "1x",
|
||||||
"size" : "32x32"
|
"size" : "32x32"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "64.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "2x",
|
"scale" : "2x",
|
||||||
"size" : "32x32"
|
"size" : "32x32"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "128.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "1x",
|
"scale" : "1x",
|
||||||
"size" : "128x128"
|
"size" : "128x128"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "256.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "2x",
|
"scale" : "2x",
|
||||||
"size" : "128x128"
|
"size" : "128x128"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "256.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "1x",
|
"scale" : "1x",
|
||||||
"size" : "256x256"
|
"size" : "256x256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "512.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "2x",
|
"scale" : "2x",
|
||||||
"size" : "256x256"
|
"size" : "256x256"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "512.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "1x",
|
"scale" : "1x",
|
||||||
"size" : "512x512"
|
"size" : "512x512"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "1024.png",
|
|
||||||
"idiom" : "mac",
|
"idiom" : "mac",
|
||||||
"scale" : "2x",
|
"scale" : "2x",
|
||||||
"size" : "512x512"
|
"size" : "512x512"
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "48.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "notificationCenter",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "24x24",
|
|
||||||
"subtype" : "38mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "55.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "notificationCenter",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "27.5x27.5",
|
|
||||||
"subtype" : "42mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "58.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "companionSettings",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "87.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "companionSettings",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "66.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "notificationCenter",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "33x33",
|
|
||||||
"subtype" : "45mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "80.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "40x40",
|
|
||||||
"subtype" : "38mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "88.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "44x44",
|
|
||||||
"subtype" : "40mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "92.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "46x46",
|
|
||||||
"subtype" : "41mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "100.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "50x50",
|
|
||||||
"subtype" : "44mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "102.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "51x51",
|
|
||||||
"subtype" : "45mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "108.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "appLauncher",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "54x54",
|
|
||||||
"subtype" : "49mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "172.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "quickLook",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "86x86",
|
|
||||||
"subtype" : "38mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "196.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "quickLook",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "98x98",
|
|
||||||
"subtype" : "42mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "216.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "quickLook",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "108x108",
|
|
||||||
"subtype" : "44mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "234.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "quickLook",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "117x117",
|
|
||||||
"subtype" : "45mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "258.png",
|
|
||||||
"idiom" : "watch",
|
|
||||||
"role" : "quickLook",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "129x129",
|
|
||||||
"subtype" : "49mm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "1024.png",
|
|
||||||
"idiom" : "watch-marketing",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "1024x1024"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
import Foundation
|
|
||||||
import Combine
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct BookmarksView: View {
|
struct BookmarksView: View {
|
||||||
@ -8,15 +6,10 @@ struct BookmarksView: View {
|
|||||||
@State private var selectedBookmarkId: String?
|
@State private var selectedBookmarkId: String?
|
||||||
let state: BookmarkState
|
let state: BookmarkState
|
||||||
|
|
||||||
@Binding var selectedBookmark: Bookmark?
|
|
||||||
|
|
||||||
@State private var showingAddBookmarkFromShare = false
|
@State private var showingAddBookmarkFromShare = false
|
||||||
@State private var shareURL = ""
|
@State private var shareURL = ""
|
||||||
@State private var shareTitle = ""
|
@State private var shareTitle = ""
|
||||||
|
|
||||||
@Environment(\.horizontalSizeClass) var horizontalSizeClass
|
|
||||||
@Environment(\.verticalSizeClass) var verticalSizeClass
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ZStack {
|
ZStack {
|
||||||
@ -26,11 +19,7 @@ struct BookmarksView: View {
|
|||||||
List {
|
List {
|
||||||
ForEach(viewModel.bookmarks, id: \.id) { bookmark in
|
ForEach(viewModel.bookmarks, id: \.id) { bookmark in
|
||||||
Button(action: {
|
Button(action: {
|
||||||
if UIDevice.isPhone {
|
selectedBookmarkId = bookmark.id
|
||||||
selectedBookmarkId = bookmark.id
|
|
||||||
} else {
|
|
||||||
selectedBookmark = bookmark
|
|
||||||
}
|
|
||||||
}) {
|
}) {
|
||||||
BookmarkCardView(
|
BookmarkCardView(
|
||||||
bookmark: bookmark,
|
bookmark: bookmark,
|
||||||
@ -116,13 +105,13 @@ struct BookmarksView: View {
|
|||||||
.sheet(isPresented: $showingAddBookmark) {
|
.sheet(isPresented: $showingAddBookmark) {
|
||||||
AddBookmarkView(prefilledURL: shareURL, prefilledTitle: shareTitle)
|
AddBookmarkView(prefilledURL: shareURL, prefilledTitle: shareTitle)
|
||||||
}
|
}
|
||||||
/*.alert("Fehler", isPresented: .constant(viewModel.errorMessage != nil)) {
|
.alert("Fehler", isPresented: .constant(viewModel.errorMessage != nil)) {
|
||||||
Button("OK", role: .cancel) {
|
Button("OK", role: .cancel) {
|
||||||
viewModel.errorMessage = nil
|
viewModel.errorMessage = nil
|
||||||
}
|
}
|
||||||
} message: {
|
} message: {
|
||||||
Text(viewModel.errorMessage ?? "")
|
Text(viewModel.errorMessage ?? "")
|
||||||
}*/
|
}
|
||||||
.task {
|
.task {
|
||||||
await viewModel.loadBookmarks(state: state)
|
await viewModel.loadBookmarks(state: state)
|
||||||
}
|
}
|
||||||
@ -134,8 +123,24 @@ struct BookmarksView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("AddBookmarkFromShare"))) { notification in
|
||||||
|
handleShareNotification(notification)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.searchable(text: $viewModel.searchQuery, placement: .automatic, prompt: "Search...")
|
}
|
||||||
|
|
||||||
|
private func handleShareNotification(_ notification: Notification) {
|
||||||
|
guard let userInfo = notification.userInfo,
|
||||||
|
let url = userInfo["url"] as? String,
|
||||||
|
!url.isEmpty else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
shareURL = url
|
||||||
|
shareTitle = userInfo["title"] as? String ?? ""
|
||||||
|
showingAddBookmark = true
|
||||||
|
|
||||||
|
print("Received share notification - URL: \(url), Title: \(shareTitle)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,14 +24,6 @@ class BookmarksViewModel {
|
|||||||
private var offset = 0
|
private var offset = 0
|
||||||
private var hasMoreData = true
|
private var hasMoreData = true
|
||||||
|
|
||||||
var searchQuery: String = "" {
|
|
||||||
didSet {
|
|
||||||
throttleSearch()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var searchWorkItem: DispatchWorkItem?
|
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
setupNotificationObserver()
|
setupNotificationObserver()
|
||||||
}
|
}
|
||||||
@ -61,20 +53,6 @@ class BookmarksViewModel {
|
|||||||
print("Received share notification - URL: \(url)")
|
print("Received share notification - URL: \(url)")
|
||||||
}
|
}
|
||||||
|
|
||||||
private func throttleSearch() {
|
|
||||||
searchWorkItem?.cancel()
|
|
||||||
|
|
||||||
let workItem = DispatchWorkItem { [weak self] in
|
|
||||||
guard let self = self else { return }
|
|
||||||
Task {
|
|
||||||
await self.loadBookmarks(state: self.currentState)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
searchWorkItem = workItem
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3, execute: workItem)
|
|
||||||
}
|
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
func loadBookmarks(state: BookmarkState = .unread) async {
|
func loadBookmarks(state: BookmarkState = .unread) async {
|
||||||
isLoading = true
|
isLoading = true
|
||||||
@ -84,12 +62,7 @@ class BookmarksViewModel {
|
|||||||
hasMoreData = true // Pagination zurücksetzen
|
hasMoreData = true // Pagination zurücksetzen
|
||||||
|
|
||||||
do {
|
do {
|
||||||
let newBookmarks = try await getBooksmarksUseCase.execute(
|
let newBookmarks = try await getBooksmarksUseCase.execute(state: state, limit: limit, offset: offset)
|
||||||
state: state,
|
|
||||||
limit: limit,
|
|
||||||
offset: offset,
|
|
||||||
search: searchQuery // Suche integrieren
|
|
||||||
)
|
|
||||||
bookmarks = newBookmarks
|
bookmarks = newBookmarks
|
||||||
hasMoreData = newBookmarks.count == limit // Prüfen, ob weitere Daten verfügbar sind
|
hasMoreData = newBookmarks.count == limit // Prüfen, ob weitere Daten verfügbar sind
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@ -32,39 +32,21 @@ enum BookmarkState: String, CaseIterable {
|
|||||||
struct MainTabView: View {
|
struct MainTabView: View {
|
||||||
@State private var selectedTab: String = "Ungelesen"
|
@State private var selectedTab: String = "Ungelesen"
|
||||||
|
|
||||||
// sizeClass
|
|
||||||
@Environment(\.horizontalSizeClass)
|
|
||||||
var horizontalSizeClass
|
|
||||||
|
|
||||||
@Environment(\.verticalSizeClass)
|
|
||||||
var verticalSizeClass
|
|
||||||
|
|
||||||
@State var selectedBookmark: Bookmark?
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if UIDevice.isPhone {
|
|
||||||
PhoneView()
|
|
||||||
} else {
|
|
||||||
PadView()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ViewBuilder
|
|
||||||
private func PhoneView() -> some View {
|
|
||||||
TabView(selection: $selectedTab) {
|
TabView(selection: $selectedTab) {
|
||||||
BookmarksView(state: .unread, selectedBookmark: .constant(nil))
|
BookmarksView(state: .unread)
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Ungelesen", systemImage: "house")
|
Label("Ungelesen", systemImage: "house")
|
||||||
}
|
}
|
||||||
.tag("Ungelesen")
|
.tag("Ungelesen")
|
||||||
|
|
||||||
BookmarksView(state: .favorite, selectedBookmark: .constant(nil))
|
BookmarksView(state: .favorite)
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Favoriten", systemImage: "heart")
|
Label("Favoriten", systemImage: "heart")
|
||||||
}
|
}
|
||||||
.tag("Favoriten")
|
.tag("Favoriten")
|
||||||
|
|
||||||
BookmarksView(state: .archived, selectedBookmark: .constant(nil))
|
BookmarksView(state: .archived)
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Archiv", systemImage: "archivebox")
|
Label("Archiv", systemImage: "archivebox")
|
||||||
}
|
}
|
||||||
@ -76,81 +58,10 @@ struct MainTabView: View {
|
|||||||
}
|
}
|
||||||
.tag("Settings")
|
.tag("Settings")
|
||||||
}
|
}
|
||||||
.accentColor(.accentColor)
|
.accentColor(.blue)
|
||||||
}
|
|
||||||
|
|
||||||
@ViewBuilder
|
|
||||||
private func PadView() -> some View {
|
|
||||||
TabView(selection: $selectedTab) {
|
|
||||||
// Ungelesen Tab
|
|
||||||
NavigationSplitView {
|
|
||||||
BookmarksView(state: .unread, selectedBookmark: $selectedBookmark)
|
|
||||||
} detail: {
|
|
||||||
if let selectedBookmark = selectedBookmark {
|
|
||||||
BookmarkDetailView(bookmarkId: selectedBookmark.id)
|
|
||||||
} else {
|
|
||||||
Text("Select a bookmark")
|
|
||||||
.foregroundColor(.gray)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.tabItem {
|
|
||||||
Label("Unread", systemImage: "house")
|
|
||||||
}
|
|
||||||
.tag("Unread")
|
|
||||||
|
|
||||||
NavigationSplitViewContainer(state: .favorite, selectedBookmark: $selectedBookmark)
|
|
||||||
.tabItem {
|
|
||||||
Label("Favoriten", systemImage: "heart")
|
|
||||||
}
|
|
||||||
.tag("Favorite")
|
|
||||||
|
|
||||||
NavigationSplitViewContainer(state: .archived, selectedBookmark: $selectedBookmark)
|
|
||||||
.tabItem {
|
|
||||||
Label("Archive", systemImage: "archivebox")
|
|
||||||
}
|
|
||||||
.tag("Archive")
|
|
||||||
|
|
||||||
SettingsView()
|
|
||||||
.tabItem {
|
|
||||||
Label("Settings", systemImage: "gear")
|
|
||||||
}
|
|
||||||
.tag("Settings")
|
|
||||||
}
|
|
||||||
.accentColor(.accentColor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Container für NavigationSplitView
|
|
||||||
struct NavigationSplitViewContainer: View {
|
|
||||||
let state: BookmarkState
|
|
||||||
@Binding var selectedBookmark: Bookmark?
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
NavigationSplitView {
|
|
||||||
BookmarksView(state: state, selectedBookmark: $selectedBookmark)
|
|
||||||
} detail: {
|
|
||||||
if let selectedBookmark = selectedBookmark {
|
|
||||||
BookmarkDetailView(bookmarkId: selectedBookmark.id)
|
|
||||||
} else {
|
|
||||||
Text("Select a bookmark")
|
|
||||||
.foregroundColor(.gray)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
MainTabView()
|
MainTabView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extension UIDevice {
|
|
||||||
static var isPad: Bool {
|
|
||||||
return UIDevice.current.userInterfaceIdiom == .pad
|
|
||||||
}
|
|
||||||
|
|
||||||
static var isPhone: Bool {
|
|
||||||
return UIDevice.current.userInterfaceIdiom == .phone
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import netfox
|
|
||||||
|
|
||||||
@main
|
@main
|
||||||
struct readeckApp: App {
|
struct readeckApp: App {
|
||||||
@ -19,11 +18,6 @@ struct readeckApp: App {
|
|||||||
.onOpenURL { url in
|
.onOpenURL { url in
|
||||||
handleIncomingURL(url)
|
handleIncomingURL(url)
|
||||||
}
|
}
|
||||||
.onAppear {
|
|
||||||
#if DEBUG
|
|
||||||
NFX.sharedInstance().start()
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||