Files
CT/src/View/Components/fileBrowser.tsx
T

62 lines
1.5 KiB
TypeScript
Raw Normal View History

2024-07-21 17:55:53 +02:00
import "./fileBrowser.css";
import * as React from "bloatless-react";
2024-07-21 18:56:56 +02:00
import StorageModel, {
PATH_COMPONENT_SEPARATOR,
} from "../../Model/storageModel";
2024-07-21 17:55:53 +02:00
import { DirectoryItemList } from "./directoryItemList";
export function FileBrowser(
storageModel: StorageModel,
selectedPath: React.State<string>
) {
2024-07-21 18:56:56 +02:00
// state
2024-07-21 17:55:53 +02:00
const fileContent = React.createProxyState([selectedPath], () => {
const path = StorageModel.stringToPathComponents(selectedPath.value);
const content = storageModel.restore(path);
return content || "";
});
2024-07-21 18:56:56 +02:00
const selectedFileName = React.createProxyState(
[selectedPath],
() =>
StorageModel.getFileNameFromString(selectedPath.value) ??
PATH_COMPONENT_SEPARATOR
);
// view
const view = (
2024-07-21 17:55:53 +02:00
<div class="file-browser">
<div>
2024-07-21 18:56:56 +02:00
<div class="scroll-area">
{DirectoryItemList(
storageModel,
PATH_COMPONENT_SEPARATOR,
selectedPath
)}
</div>
<div class="detail-button-wrapper">
<button class="ghost" on:click={scrollToDetails}>
<span
class="ellipsis"
subscribe:innerText={selectedFileName}
></span>
<span class="icon">arrow_forward</span>
</button>
</div>
</div>
<div class="scroll-area">
2024-07-21 17:55:53 +02:00
<code subscribe:innerText={fileContent}></code>
</div>
</div>
);
2024-07-21 18:56:56 +02:00
function scrollToDetails() {
view.scrollLeft = view.scrollWidth;
}
return view;
2024-07-21 17:55:53 +02:00
}