Compare commits

...

2 Commits

Author SHA1 Message Date
Triston Armstrong
4f0e588efa refactor and improve image logic 2024-10-05 14:33:07 -04:00
Triston Armstrong
9016796b51 focus newly added card 2024-10-05 13:16:25 -04:00
6 changed files with 54 additions and 26 deletions

View File

@ -1,5 +1,8 @@
import { useRef } from "kaioken"
import { ImagesSignal, NotesSigal } from "../signals"
import { updateLocalStorage } from "../utils/localStorage"
import notes from "../signals/notes"
import images from "../signals/images"
export function CardSelector() {
const containerRef = useRef<HTMLDivElement>(null)
@ -19,7 +22,6 @@ export function CardSelector() {
function StickyNote() {
function _handleClick(e: MouseEvent) {
NotesSigal.default.addNote({
type: "note",
title: "New Note",
@ -33,6 +35,7 @@ function StickyNote() {
h: 200
}
})
updateLocalStorage("notes", notes.notes.value)
}
return (
@ -59,14 +62,23 @@ function StickyNote() {
}
function Image() {
function _handleClick() {
function _handleClick(mouseEvent: MouseEvent) {
const input = document.createElement('input')
input.type = 'file'
input.onchange = (e: any) => {
const file = e.target.files[0]
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = readerEvent => {
reader.onload = function(readerEvent) {
let image = document.createElement('img')
image.onload = function() {
const { width, height } = image
// normalize the dimensions so that they fit within a constraint
const len = Math.sqrt(width * width + height * height)
const normalizedW = (width / len) * 300
const normalizedH = (height / len) * 300
const content = readerEvent.target?.result;
let img: string = '';
if (typeof content == 'string') img = content?.split(':')[1]
@ -77,14 +89,17 @@ function Image() {
title: "New Image",
contents: content as string,
position: {
x: e.pageX - 100,
y: e.pageY + (window.innerHeight / 2) - 100
x: mouseEvent.pageX - 100,
y: mouseEvent.pageY + (window.innerHeight / 2) - 100
},
dimensions: {
w: 200,
h: 200
w: normalizedW,
h: normalizedH
}
})
updateLocalStorage("images", images.images.value)
}
image.src = readerEvent.target?.result as string
}
}
input.click()

View File

@ -3,6 +3,7 @@ import { ImagesSignal, focusedItem } from "../signals"
import { useDebounce } from "../utils/useDebounce"
import { LayerEnum } from "../utils/enums"
import images, { ImageCardType } from "../signals/images"
import { updateLocalStorage } from "../utils/localStorage"
namespace ImageCard {
export interface ImageCardProps {
@ -19,9 +20,9 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
const offsetY = useRef(0)
const { debounce } = useDebounce()
function updateLocalStorage(time?: number) {
function debounceLSUpdate(time?: number) {
debounce(() => {
localStorage.setItem("images", JSON.stringify(images.images.value))
updateLocalStorage("images", images.images.value)
}, time)
}
@ -34,7 +35,7 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
const newPos = { x: newX.current, y: newY.current }
ImagesSignal.default.updateImageProperty(itemKey, 'position', newPos)
updateLocalStorage()
debounceLSUpdate()
}
function _handleMouseUp(e: MouseEvent) {
@ -62,7 +63,8 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
zIndex: `${focusedItem.value == itemKey ? LayerEnum.CARD_ELEVATED : LayerEnum.CARD}`,
top: `${item.position.y}px`,
left: `${item.position.x}px`,
maxWidth: '300px',
width: `${item.dimensions.w}px`,
height: `${item.dimensions.h}px`,
backgroundColor: '#181818'
}}
>
@ -70,7 +72,7 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
<button className="flex justify-center items-center hover:bg-blue-500 w-5 h-5 text-white text-md absolute right-0 top-0" onclick={(_e: Event) => {
ImagesSignal.default.removeImage(item.id)
ImagesSignal.default.images.notify()
updateLocalStorage()
debounceLSUpdate()
}}>x</button>
<img
src={item.contents}

View File

@ -46,6 +46,7 @@ export function MiniMap() {
{Object.keys(images.images.value).map((imageKey: ImageCardType['id']) => {
const image = images.images.value[imageKey]
const el = useRef(null)
function _handleItemClick(_e: MouseEvent) {
window.scrollTo({
@ -56,7 +57,7 @@ export function MiniMap() {
}
return (
<div className={"bg-green-500 hover:bg-blue-500 cursor-pointer"}
<div ref={el} className={"bg-green-500 hover:bg-blue-500 cursor-pointer"}
onclick={_handleItemClick}
style={{
position: 'absolute',

View File

@ -1,5 +1,6 @@
import { signal } from "kaioken"
import { Card } from "../types"
import { focusedItem } from "."
export type ImageCardType = Card<"image">
@ -16,6 +17,7 @@ function addImage(data: Omit<ImageCardType, "id">) {
}
images.value[newCard.id] = newCard
images.notify()
focusedItem.value = newCard.id
}
function removeImage(id: ImageCardType["id"]) {

View File

@ -1,5 +1,6 @@
import { signal } from "kaioken"
import { Card } from "../types"
import { focusedItem } from "."
export type NoteCardType = Card<"note">
@ -16,6 +17,7 @@ function addNote(data: Omit<NoteCardType, "id">) {
}
notes.value[newCard.id] = newCard
notes.notify()
focusedItem.value = newCard.id
}
function removeNote(id: NoteCardType["id"]) {

View File

@ -0,0 +1,6 @@
export function updateLocalStorage(
location: "notes" | "images",
collection: unknown[] | Record<string, unknown>
) {
localStorage.setItem(location, JSON.stringify(collection))
}