2023-06-08 18:22:45 +03:00
|
|
|
import { AssetGridState, BucketPosition } from '$lib/models/asset-grid-state';
|
2022-09-04 08:34:39 -05:00
|
|
|
import { api, AssetResponseDto } from '@api';
|
|
|
|
|
import { derived, writable } from 'svelte/store';
|
|
|
|
|
import { assetGridState, assetStore } from './assets.store';
|
|
|
|
|
|
|
|
|
|
// Asset Viewer
|
|
|
|
|
export const viewingAssetStoreState = writable<AssetResponseDto>();
|
|
|
|
|
export const isViewingAssetStoreState = writable<boolean>(false);
|
|
|
|
|
|
|
|
|
|
// Multi-Selection mode
|
|
|
|
|
export const assetsInAlbumStoreState = writable<AssetResponseDto[]>([]);
|
|
|
|
|
export const selectedAssets = writable<Set<AssetResponseDto>>(new Set());
|
|
|
|
|
export const selectedGroup = writable<Set<string>>(new Set());
|
2023-07-01 00:50:47 -04:00
|
|
|
export const isMultiSelectStoreState = derived(selectedAssets, ($selectedAssets) => $selectedAssets.size > 0);
|
2022-09-04 08:34:39 -05:00
|
|
|
|
|
|
|
|
function createAssetInteractionStore() {
|
2023-07-01 00:50:47 -04:00
|
|
|
let _assetGridState = new AssetGridState();
|
|
|
|
|
let _viewingAssetStoreState: AssetResponseDto;
|
|
|
|
|
let _selectedAssets: Set<AssetResponseDto>;
|
|
|
|
|
let _selectedGroup: Set<string>;
|
|
|
|
|
let _assetsInAlbums: AssetResponseDto[];
|
|
|
|
|
|
|
|
|
|
// Subscriber
|
|
|
|
|
assetGridState.subscribe((state) => {
|
|
|
|
|
_assetGridState = state;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
viewingAssetStoreState.subscribe((asset) => {
|
|
|
|
|
_viewingAssetStoreState = asset;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
selectedAssets.subscribe((assets) => {
|
|
|
|
|
_selectedAssets = assets;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
selectedGroup.subscribe((group) => {
|
|
|
|
|
_selectedGroup = group;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
assetsInAlbumStoreState.subscribe((assets) => {
|
|
|
|
|
_assetsInAlbums = assets;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Methods
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Asset Viewer
|
|
|
|
|
*/
|
|
|
|
|
const setViewingAsset = async (asset: AssetResponseDto) => {
|
|
|
|
|
setViewingAssetId(asset.id);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const setViewingAssetId = async (id: string) => {
|
|
|
|
|
const { data } = await api.assetApi.getAssetById({ id });
|
|
|
|
|
viewingAssetStoreState.set(data);
|
|
|
|
|
isViewingAssetStoreState.set(true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const setIsViewingAsset = (isViewing: boolean) => {
|
|
|
|
|
isViewingAssetStoreState.set(isViewing);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const navigateAsset = async (direction: 'next' | 'previous') => {
|
2023-07-03 03:02:38 +01:00
|
|
|
let index = _assetGridState.assets.findIndex(({ id }) => id === _viewingAssetStoreState.id);
|
2023-07-01 00:50:47 -04:00
|
|
|
|
2023-07-03 03:02:38 +01:00
|
|
|
index = direction === 'next' ? index + 1 : index - 1;
|
2023-07-01 00:50:47 -04:00
|
|
|
|
2023-07-03 03:02:38 +01:00
|
|
|
const needMoreAbove = index < 0;
|
|
|
|
|
const needMoreBelow = index >= _assetGridState.assets.length;
|
2023-07-01 00:50:47 -04:00
|
|
|
|
2023-07-03 03:02:38 +01:00
|
|
|
// Try to load more assets if we're at the end.
|
|
|
|
|
if (needMoreAbove || needMoreBelow) {
|
2023-07-01 00:50:47 -04:00
|
|
|
for (const bucket of _assetGridState.buckets) {
|
|
|
|
|
if (bucket.assets.length === 0) {
|
2023-07-03 03:02:38 +01:00
|
|
|
await assetStore.getAssetsByBucket(
|
|
|
|
|
bucket.bucketDate,
|
|
|
|
|
needMoreAbove ? BucketPosition.Above : BucketPosition.Below,
|
|
|
|
|
);
|
|
|
|
|
navigateAsset(direction);
|
2023-07-01 00:50:47 -04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-03 03:02:38 +01:00
|
|
|
const asset = _assetGridState.assets[index];
|
|
|
|
|
if (asset) {
|
|
|
|
|
setViewingAsset(asset);
|
2023-07-01 00:50:47 -04:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Multiselect
|
|
|
|
|
*/
|
|
|
|
|
const addAssetToMultiselectGroup = (asset: AssetResponseDto) => {
|
|
|
|
|
// Not select if in album already
|
|
|
|
|
if (_assetsInAlbums.find((a) => a.id === asset.id)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_selectedAssets.add(asset);
|
|
|
|
|
selectedAssets.set(_selectedAssets);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const removeAssetFromMultiselectGroup = (asset: AssetResponseDto) => {
|
|
|
|
|
_selectedAssets.delete(asset);
|
|
|
|
|
selectedAssets.set(_selectedAssets);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const addGroupToMultiselectGroup = (group: string) => {
|
|
|
|
|
_selectedGroup.add(group);
|
|
|
|
|
selectedGroup.set(_selectedGroup);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const removeGroupFromMultiselectGroup = (group: string) => {
|
|
|
|
|
_selectedGroup.delete(group);
|
|
|
|
|
selectedGroup.set(_selectedGroup);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const clearMultiselect = () => {
|
|
|
|
|
_selectedAssets.clear();
|
|
|
|
|
_selectedGroup.clear();
|
|
|
|
|
_assetsInAlbums = [];
|
|
|
|
|
|
|
|
|
|
selectedAssets.set(_selectedAssets);
|
|
|
|
|
selectedGroup.set(_selectedGroup);
|
|
|
|
|
assetsInAlbumStoreState.set(_assetsInAlbums);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
setViewingAsset,
|
|
|
|
|
setViewingAssetId,
|
|
|
|
|
setIsViewingAsset,
|
|
|
|
|
navigateAsset,
|
|
|
|
|
addAssetToMultiselectGroup,
|
|
|
|
|
removeAssetFromMultiselectGroup,
|
|
|
|
|
addGroupToMultiselectGroup,
|
|
|
|
|
removeGroupFromMultiselectGroup,
|
|
|
|
|
clearMultiselect,
|
|
|
|
|
};
|
2022-09-04 08:34:39 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const assetInteractionStore = createAssetInteractionStore();
|