-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #65 from varun-raj/feat-nov-release
Feat: November 2024 release
- Loading branch information
Showing
17 changed files
with
285 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ name: ci | |
on: | ||
push: | ||
branches: | ||
- main | ||
- release | ||
|
||
jobs: | ||
release: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
128 changes: 128 additions & 0 deletions
128
src/components/assets/assets-options/AssetOffsetDialog.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
import React, { useEffect, useState } from 'react' | ||
import { IAsset } from '@/types/asset'; | ||
import { Dialog, DialogTitle, DialogHeader, DialogContent } from '@/components/ui/dialog'; | ||
import { Label } from '@/components/ui/label'; | ||
import { Input } from '@/components/ui/input'; | ||
import { Button } from '@/components/ui/button'; | ||
import { formatDate, offsetDate } from '@/helpers/date.helper'; | ||
import LazyImage from '@/components/ui/lazy-image'; | ||
import Image from 'next/image'; | ||
import { updateAssets } from '@/handlers/api/asset.handler'; | ||
import { useToast } from '@/components/ui/use-toast'; | ||
|
||
interface IProps { | ||
assets: IAsset[]; | ||
open: boolean; | ||
toggleOpen: (open: boolean) => void; | ||
} | ||
|
||
export default function AssetOffsetDialog({ assets: _assets, open, toggleOpen }: IProps) { | ||
const { toast } = useToast(); | ||
const [assets, setAssets] = useState<IAsset[]>(_assets); | ||
const [offsetData, setOffsetData] = useState<{ days: number, hours: number, minutes: number, seconds: number, years: number }>({ | ||
days: 0, | ||
hours: 0, | ||
minutes: 0, | ||
seconds: 0, | ||
years: 0 | ||
}); | ||
const [loading, setLoading] = useState(false); | ||
const [assetStatus, setAssetStatus] = useState<Record<string, string>>({}); | ||
|
||
const handleChange = (key: keyof typeof offsetData, value: number) => { | ||
setOffsetData({ ...offsetData, [key]: value }); | ||
} | ||
|
||
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { | ||
e.preventDefault(); | ||
console.log(offsetData); | ||
setLoading(true); | ||
const promises = assets.map(async (asset) => { | ||
setAssetStatus({ [asset.id]: 'pending' }); | ||
await updateAssets({ | ||
ids: [asset.id], | ||
dateTimeOriginal: offsetDate(asset.dateTimeOriginal, offsetData) | ||
}) | ||
.then(() => { | ||
setLoading(false); | ||
toggleOpen(false); | ||
}) | ||
.catch((error) => { | ||
setLoading(false); | ||
setAssetStatus({ [asset.id]: 'error' }); | ||
}) | ||
}); | ||
await Promise.all(promises); | ||
setLoading(false); | ||
toggleOpen(false); | ||
toast({ | ||
title: 'Asset dates offset', | ||
description: 'Asset dates have been offset', | ||
}) | ||
} | ||
|
||
|
||
useEffect(() => { | ||
setAssets(_assets); | ||
}, [_assets]); | ||
|
||
return ( | ||
<Dialog open={open} onOpenChange={toggleOpen}> | ||
<DialogContent className='max-w-[800px]'> | ||
<DialogHeader> | ||
<DialogTitle>Offset Asset Dates</DialogTitle> | ||
</DialogHeader> | ||
<form onSubmit={handleSubmit} className='flex items-center gap-2'> | ||
<div> | ||
<Label>Years</Label> | ||
<Input type="number" value={offsetData.years} onChange={(e) => handleChange("years", parseInt(e.target.value))} /> | ||
</div> | ||
<div> | ||
<Label>Days</Label> | ||
<Input type="number" value={offsetData.days} onChange={(e) => handleChange("days", parseInt(e.target.value))} /> | ||
</div> | ||
<div> | ||
<Label>Hours</Label> | ||
<Input type="number" value={offsetData.hours} onChange={(e) => handleChange("hours", parseInt(e.target.value))} /> | ||
</div> | ||
<div> | ||
<Label>Minutes</Label> | ||
<Input type="number" value={offsetData.minutes} onChange={(e) => handleChange("minutes", parseInt(e.target.value))} /> | ||
</div> | ||
<div> | ||
<Label>Seconds</Label> | ||
<Input type="number" value={offsetData.seconds} onChange={(e) => handleChange("seconds", parseInt(e.target.value))} /> | ||
</div> | ||
<Button disabled={loading} type="submit">Offset Dates</Button> | ||
</form> | ||
<div className='grid grid-cols-3 gap-4 py-2 overflow-y-auto max-h-[500px]'> | ||
{assets.map((asset) => ( | ||
<div key={asset.id} > | ||
<div className='relative w-full h-full rounded-md border overflow-hidden' > | ||
{assetStatus[asset.id] === 'pending' ? <div className='absolute text-xs text-center bottom-0 left-0 right-0 bg-blue-500/50 text-white p-2'> | ||
<p className='text-white'>Offsetting...</p> | ||
</div> : ( | ||
<div className='absolute text-xs text-center bottom-0 left-0 right-0 bg-green-500/50 text-white p-2'>{formatDate(offsetDate(asset.dateTimeOriginal, offsetData), 'PPpp')} </div> | ||
)} | ||
<Image | ||
src={asset.previewUrl} | ||
alt={asset.originalFileName} | ||
width={300} | ||
height={300} | ||
objectPosition='cover' | ||
style={{ | ||
objectFit: 'cover', | ||
overflow: 'hidden', | ||
height: '100%', | ||
width: '100%' | ||
}} | ||
/> | ||
<div className='absolute text-xs text-center top-0 left-0 right-0 bg-red-500/50 text-white p-2'>{formatDate(asset.dateTimeOriginal, 'PPpp')}</div> | ||
</div> | ||
</div> | ||
))} | ||
</div> | ||
</DialogContent> | ||
</Dialog> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import { Button } from '@/components/ui/button' | ||
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; | ||
import { IAsset } from '@/types/asset'; | ||
import { DotsVerticalIcon, HamburgerMenuIcon } from '@radix-ui/react-icons'; | ||
import { Clock, PlusIcon } from 'lucide-react' | ||
import React, { useState } from 'react' | ||
import AssetOffsetDialog from './AssetOffsetDialog'; | ||
|
||
interface IProps { | ||
onAdd?: () => void; | ||
assets: IAsset[]; | ||
} | ||
export default function AssetsOptions({ onAdd, assets }: IProps) { | ||
const [open, setOpen] = useState(false); | ||
|
||
return ( | ||
<> | ||
<DropdownMenu> | ||
<DropdownMenuTrigger asChild className='cursor-pointer'> | ||
<HamburgerMenuIcon className="w-4 h-4" /> | ||
</DropdownMenuTrigger> | ||
<DropdownMenuContent> | ||
<DropdownMenuItem className='flex items-center gap-2' onSelect={() => setOpen(true)}> | ||
<Clock className="w-4 h-4" /> Offset Asset Dates | ||
</DropdownMenuItem> | ||
</DropdownMenuContent> | ||
</DropdownMenu> | ||
{open && <AssetOffsetDialog assets={assets} open={open} toggleOpen={setOpen} />} | ||
</> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.