Skip to content

Commit 0b0a1cd

Browse files
committed
[FileManager] Create file and folder
1 parent 708b5bf commit 0b0a1cd

File tree

7 files changed

+124
-0
lines changed

7 files changed

+124
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "CreateFile.svg",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"idiom" : "universal",
10+
"scale" : "2x"
11+
},
12+
{
13+
"idiom" : "universal",
14+
"scale" : "3x"
15+
}
16+
],
17+
"info" : {
18+
"author" : "xcode",
19+
"version" : 1
20+
}
21+
}
Lines changed: 4 additions & 0 deletions
Loading
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "CreateFolder.svg",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"idiom" : "universal",
10+
"scale" : "2x"
11+
},
12+
{
13+
"idiom" : "universal",
14+
"scale" : "3x"
15+
}
16+
],
17+
"info" : {
18+
"author" : "xcode",
19+
"version" : 1
20+
}
21+
}
Lines changed: 4 additions & 0 deletions
Loading

Flipper/iOS/UI/FileManager/Components/FileListingOptions.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,25 @@ extension FileManagerView.FileManagerListing {
55
@Binding var isPresented: Bool
66
@Binding var settings: FileManagerSettings
77

8+
let createFolder: () -> Void
9+
let createFile: () -> Void
810
let upload: () -> Void
911

1012
var body: some View {
1113
HStack {
1214
Spacer()
1315
Card {
1416
VStack(alignment: .leading, spacing: 0) {
17+
Option(title: "Create Folder", image: "CreateFolder") {
18+
isPresented = false
19+
createFolder()
20+
}
21+
22+
Option(title: "Create File", image: "CreateFile") {
23+
isPresented = false
24+
createFile()
25+
}
26+
1527
Option(title: "Upload", image: "Share") {
1628
isPresented = false
1729
upload()

Flipper/iOS/UI/FileManager/FileManagerListing.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ extension FileManagerView {
2323
@State private var selectedElement: ExtendedElement?
2424
@State private var deletedElement: ExtendedElement?
2525

26+
// MARK: Create File/Directory
27+
@FocusState var isNameFocused: Bool
28+
@State private var newElement: FileManagerNewElement?
29+
2630
@AppStorage(.fileManagerSettings)
2731
private var settings: FileManagerSettings = .init()
2832

@@ -59,6 +63,20 @@ extension FileManagerView {
5963
}
6064
.padding([.horizontal, .top], 14)
6165

66+
if let newElement {
67+
TextField(
68+
newElement.namePlaceholder,
69+
text: Binding(
70+
get: { self.newElement?.name ?? "" },
71+
set: { self.newElement?.name = $0 }
72+
)
73+
)
74+
.textFieldStyle(.roundedBorder)
75+
.onSubmit { submitNewElement() }
76+
.focused($isNameFocused)
77+
.padding([.horizontal, .top], 14)
78+
}
79+
6280
Group {
6381
if elements.isEmpty {
6482
EmptyFolder(onUpload: showUpload)
@@ -103,6 +121,8 @@ extension FileManagerView {
103121
FileListingOptions(
104122
isPresented: $showOptions,
105123
settings: $settings,
124+
createFolder: { newElement(isDirectory: true) },
125+
createFile: { newElement(isDirectory: false) },
106126
upload: showUpload
107127
)
108128
}
@@ -229,6 +249,34 @@ extension FileManagerView {
229249
private func showUpload() {
230250
isFileImporterPresented = true
231251
}
252+
253+
// MARK: Create File/Directory
254+
func newElement(isDirectory: Bool) {
255+
newElement = .init(name: "", isNewDirectory: isDirectory)
256+
isNameFocused = true
257+
}
258+
259+
func submitNewElement() {
260+
guard let newElement = newElement else { return }
261+
let name = newElement.name
262+
let isNewDirectory = newElement.isNewDirectory
263+
264+
if !name.isEmpty {
265+
let path = path.appending(name)
266+
let isDirectory = isNewDirectory
267+
Task {
268+
do {
269+
try await fileManager.create(
270+
path: path,
271+
isDirectory: isDirectory)
272+
await load()
273+
} catch {
274+
self.error = String(describing: error)
275+
}
276+
}
277+
}
278+
self.newElement = nil
279+
}
232280
}
233281
}
234282

Flipper/iOS/UI/FileManager/FileManagerSettings.swift renamed to Flipper/iOS/UI/FileManager/FileManagerModels.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,17 @@ struct FileManagerSettings: Codable, RawRepresentable {
4949
try container.encode(displayType, forKey: .displayType)
5050
}
5151
}
52+
53+
struct FileManagerNewElement {
54+
var name: String
55+
let isNewDirectory: Bool
56+
57+
init(name: String, isNewDirectory: Bool) {
58+
self.name = name
59+
self.isNewDirectory = isNewDirectory
60+
}
61+
62+
var namePlaceholder: String {
63+
"\(isNewDirectory ? "directory" : "file") name"
64+
}
65+
}

0 commit comments

Comments
 (0)