mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-21 08:21:19 +02:00
Drag into folder (Closes #8)
This commit is contained in:
@@ -4,6 +4,8 @@ use log::info;
|
|||||||
use tauri::{AppHandle, updater, Window, Wry};
|
use tauri::{AppHandle, updater, Window, Wry};
|
||||||
use tauri::api::dialog;
|
use tauri::api::dialog;
|
||||||
|
|
||||||
|
use crate::is_dev;
|
||||||
|
|
||||||
// Check for updates every 3 hours
|
// Check for updates every 3 hours
|
||||||
const MAX_UPDATE_CHECK_SECONDS: u64 = 60 * 60 * 3;
|
const MAX_UPDATE_CHECK_SECONDS: u64 = 60 * 60 * 3;
|
||||||
|
|
||||||
@@ -28,6 +30,10 @@ impl YaakUpdater {
|
|||||||
app_handle: &AppHandle<Wry>,
|
app_handle: &AppHandle<Wry>,
|
||||||
mode: UpdateMode,
|
mode: UpdateMode,
|
||||||
) -> Result<(), updater::Error> {
|
) -> Result<(), updater::Error> {
|
||||||
|
if is_dev() {
|
||||||
|
info!("Skipping update check because we are in dev mode");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
self.last_update_check = SystemTime::now();
|
self.last_update_check = SystemTime::now();
|
||||||
let update_mode = get_update_mode_str(mode);
|
let update_mode = get_update_mode_str(mode);
|
||||||
info!("Checking for updates mode={}", update_mode);
|
info!("Checking for updates mode={}", update_mode);
|
||||||
|
|||||||
@@ -78,6 +78,11 @@ export function Sidebar({ className }: Props) {
|
|||||||
namespace: NAMESPACE_NO_SYNC,
|
namespace: NAMESPACE_NO_SYNC,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const isCollapsed = useCallback(
|
||||||
|
(id: string) => collapsed.value?.[id] ?? false,
|
||||||
|
[collapsed.value],
|
||||||
|
);
|
||||||
|
|
||||||
const { tree, treeParentMap, selectableRequests } = useMemo<{
|
const { tree, treeParentMap, selectableRequests } = useMemo<{
|
||||||
tree: TreeNode | null;
|
tree: TreeNode | null;
|
||||||
treeParentMap: Record<string, TreeNode>;
|
treeParentMap: Record<string, TreeNode>;
|
||||||
@@ -258,13 +263,21 @@ export function Sidebar({ className }: Props) {
|
|||||||
|
|
||||||
const handleMove = useCallback<DraggableSidebarItemProps['onMove']>(
|
const handleMove = useCallback<DraggableSidebarItemProps['onMove']>(
|
||||||
(id, side) => {
|
(id, side) => {
|
||||||
const hoveredTree = treeParentMap[id] ?? null;
|
let hoveredTree = treeParentMap[id] ?? null;
|
||||||
const dragIndex = hoveredTree?.children.findIndex((n) => n.item.id === id) ?? -99;
|
const dragIndex = hoveredTree?.children.findIndex((n) => n.item.id === id) ?? -99;
|
||||||
const hoveredIndex = dragIndex + (side === 'above' ? 0 : 1);
|
const hoveredItem = hoveredTree?.children[dragIndex]?.item ?? null;
|
||||||
|
let hoveredIndex = dragIndex + (side === 'above' ? 0 : 1);
|
||||||
|
|
||||||
|
if (hoveredItem?.model === 'folder' && side === 'below' && !isCollapsed(hoveredItem.id)) {
|
||||||
|
// Move into folder if it's open and we're moving below it
|
||||||
|
hoveredTree = hoveredTree?.children.find((n) => n.item.id === id) ?? null;
|
||||||
|
hoveredIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
setHoveredTree(hoveredTree);
|
setHoveredTree(hoveredTree);
|
||||||
setHoveredIndex(hoveredIndex);
|
setHoveredIndex(hoveredIndex);
|
||||||
},
|
},
|
||||||
[treeParentMap],
|
[isCollapsed, treeParentMap],
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleDragStart = useCallback<DraggableSidebarItemProps['onDragStart']>((id: string) => {
|
const handleDragStart = useCallback<DraggableSidebarItemProps['onDragStart']>((id: string) => {
|
||||||
@@ -340,11 +353,8 @@ export function Sidebar({ className }: Props) {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
if (tree == null) {
|
// Not ready to render yet
|
||||||
return null;
|
if (tree == null || collapsed.value == null) {
|
||||||
}
|
|
||||||
|
|
||||||
if (collapsed.value == null) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,7 +374,7 @@ export function Sidebar({ className }: Props) {
|
|||||||
treeParentMap={treeParentMap}
|
treeParentMap={treeParentMap}
|
||||||
selectedId={selectedId}
|
selectedId={selectedId}
|
||||||
selectedTree={selectedTree}
|
selectedTree={selectedTree}
|
||||||
collapsed={collapsed.value}
|
isCollapsed={isCollapsed}
|
||||||
tree={tree}
|
tree={tree}
|
||||||
focused={hasFocus}
|
focused={hasFocus}
|
||||||
draggingId={draggingId}
|
draggingId={draggingId}
|
||||||
@@ -392,7 +402,7 @@ interface SidebarItemsProps {
|
|||||||
handleEnd: (id: string) => void;
|
handleEnd: (id: string) => void;
|
||||||
handleDragStart: (id: string) => void;
|
handleDragStart: (id: string) => void;
|
||||||
onSelect: (requestId: string) => void;
|
onSelect: (requestId: string) => void;
|
||||||
collapsed: Record<string, boolean>;
|
isCollapsed: (id: string) => boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
function SidebarItems({
|
function SidebarItems({
|
||||||
@@ -403,7 +413,7 @@ function SidebarItems({
|
|||||||
draggingId,
|
draggingId,
|
||||||
onSelect,
|
onSelect,
|
||||||
treeParentMap,
|
treeParentMap,
|
||||||
collapsed,
|
isCollapsed,
|
||||||
hoveredTree,
|
hoveredTree,
|
||||||
hoveredIndex,
|
hoveredIndex,
|
||||||
handleEnd,
|
handleEnd,
|
||||||
@@ -438,16 +448,16 @@ function SidebarItems({
|
|||||||
onSelect={onSelect}
|
onSelect={onSelect}
|
||||||
onDragStart={handleDragStart}
|
onDragStart={handleDragStart}
|
||||||
useProminentStyles={focused}
|
useProminentStyles={focused}
|
||||||
collapsed={collapsed}
|
isCollapsed={isCollapsed}
|
||||||
child={child}
|
child={child}
|
||||||
>
|
>
|
||||||
{child.item.model === 'folder' &&
|
{child.item.model === 'folder' &&
|
||||||
!collapsed[child.item.id] &&
|
!isCollapsed(child.item.id) &&
|
||||||
draggingId !== child.item.id && (
|
draggingId !== child.item.id && (
|
||||||
<SidebarItems
|
<SidebarItems
|
||||||
treeParentMap={treeParentMap}
|
treeParentMap={treeParentMap}
|
||||||
tree={child}
|
tree={child}
|
||||||
collapsed={collapsed}
|
isCollapsed={isCollapsed}
|
||||||
draggingId={draggingId}
|
draggingId={draggingId}
|
||||||
hoveredTree={hoveredTree}
|
hoveredTree={hoveredTree}
|
||||||
hoveredIndex={hoveredIndex}
|
hoveredIndex={hoveredIndex}
|
||||||
@@ -478,12 +488,10 @@ type SidebarItemProps = {
|
|||||||
itemModel: string;
|
itemModel: string;
|
||||||
useProminentStyles?: boolean;
|
useProminentStyles?: boolean;
|
||||||
selected?: boolean;
|
selected?: boolean;
|
||||||
onSelect: (id: string) => void;
|
|
||||||
draggable?: boolean;
|
draggable?: boolean;
|
||||||
children?: ReactNode;
|
children?: ReactNode;
|
||||||
collapsed: Record<string, boolean>;
|
|
||||||
child: TreeNode;
|
child: TreeNode;
|
||||||
};
|
} & Pick<SidebarItemsProps, 'isCollapsed' | 'onSelect'>;
|
||||||
|
|
||||||
const SidebarItem = forwardRef(function SidebarItem(
|
const SidebarItem = forwardRef(function SidebarItem(
|
||||||
{
|
{
|
||||||
@@ -496,7 +504,7 @@ const SidebarItem = forwardRef(function SidebarItem(
|
|||||||
useProminentStyles,
|
useProminentStyles,
|
||||||
selected,
|
selected,
|
||||||
onSelect,
|
onSelect,
|
||||||
collapsed,
|
isCollapsed,
|
||||||
child,
|
child,
|
||||||
}: SidebarItemProps,
|
}: SidebarItemProps,
|
||||||
ref: ForwardedRef<HTMLLIElement>,
|
ref: ForwardedRef<HTMLLIElement>,
|
||||||
@@ -679,7 +687,7 @@ const SidebarItem = forwardRef(function SidebarItem(
|
|||||||
icon="chevronRight"
|
icon="chevronRight"
|
||||||
className={classNames(
|
className={classNames(
|
||||||
'-ml-0.5 mr-2 transition-transform',
|
'-ml-0.5 mr-2 transition-transform',
|
||||||
!collapsed[itemId] && 'transform rotate-90',
|
!isCollapsed(itemId) && 'transform rotate-90',
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user