Files
spacedrive/interface/app/$libraryId/Explorer/File/ContextMenu/OpenWith.tsx
Vítor Vasconcellos 4078c360b4 [ENG-594] Open With Windows + fixes (#945)
* Windows `Open With` WIP
 - Listing applications capable of hanling a file type is working
 - Openning a file with a selected application is failing with unspecified error HRESULT(0x80004005) for some reason

* Fix file not opening due to COM not being initialized
 - Fix `no apps available` style

* Remove unwrap

* Fix `Open With` due to changes in main

* Fix macOS `Open With`

* Fix Windows `Open With` due to changes in main
 - Sort linux `Open With` entries, to ensure consistent app order

* Fix macOS again

* Update core.ts

* Fix windows CI being rate limited

* Clippy

* Fix CoUninitialize not being called

* minor formatting

* Implement feedback
 - Improve performance of listing apps that can handle a certain file type in Linux

* Fix broken feedback change
 - Small perf improvement to windows crate

* Some improvements to windows crate
2023-06-17 05:23:45 +00:00

72 lines
1.7 KiB
TypeScript

import { useQuery } from '@tanstack/react-query';
import { Suspense } from 'react';
import { FilePath, useLibraryContext } from '@sd/client';
import { ContextMenu } from '@sd/ui';
import { showAlertDialog } from '~/components';
import { Platform, usePlatform } from '~/util/Platform';
export default (props: { filePath: FilePath }) => {
const { getFilePathOpenWithApps, openFilePathWith } = usePlatform();
if (!getFilePathOpenWithApps || !openFilePathWith) return null;
if (props.filePath.is_dir) return null;
return (
<ContextMenu.SubMenu label="Open with">
<Suspense>
<Items
filePath={props.filePath}
actions={{
getFilePathOpenWithApps,
openFilePathWith
}}
/>
</Suspense>
</ContextMenu.SubMenu>
);
};
const Items = ({
filePath,
actions
}: {
filePath: FilePath;
actions: Required<Pick<Platform, 'getFilePathOpenWithApps' | 'openFilePathWith'>>;
}) => {
const { library } = useLibraryContext();
const items = useQuery<unknown>(
['openWith', filePath.id],
() => actions.getFilePathOpenWithApps(library.uuid, [filePath.id]),
{ suspense: true }
);
return (
<>
{Array.isArray(items.data) && items.data.length > 0 ? (
items.data.map((data, id) => (
<ContextMenu.Item
key={id}
onClick={async () => {
try {
await actions.openFilePathWith(library.uuid, [
[filePath.id, data.url]
]);
} catch (e) {
console.error(e);
showAlertDialog({
title: 'Error',
value: `Failed to open file, with: ${data.url}`
});
}
}}
>
{data.name}
</ContextMenu.Item>
))
) : (
<p className="w-full text-center text-sm text-gray-400"> No apps available </p>
)}
</>
);
};