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

View File

@ -3,6 +3,7 @@ import { ImagesSignal, focusedItem } from "../signals"
import { useDebounce } from "../utils/useDebounce" import { useDebounce } from "../utils/useDebounce"
import { LayerEnum } from "../utils/enums" import { LayerEnum } from "../utils/enums"
import images, { ImageCardType } from "../signals/images" import images, { ImageCardType } from "../signals/images"
import { updateLocalStorage } from "../utils/localStorage"
namespace ImageCard { namespace ImageCard {
export interface ImageCardProps { export interface ImageCardProps {
@ -19,9 +20,9 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
const offsetY = useRef(0) const offsetY = useRef(0)
const { debounce } = useDebounce() const { debounce } = useDebounce()
function updateLocalStorage(time?: number) { function debounceLSUpdate(time?: number) {
debounce(() => { debounce(() => {
localStorage.setItem("images", JSON.stringify(images.images.value)) updateLocalStorage("images", images.images.value)
}, time) }, time)
} }
@ -34,7 +35,7 @@ export function ImageCard({ key: itemKey, data: item }: ImageCard.ImageCardProps
const newPos = { x: newX.current, y: newY.current } const newPos = { x: newX.current, y: newY.current }
ImagesSignal.default.updateImageProperty(itemKey, 'position', newPos) ImagesSignal.default.updateImageProperty(itemKey, 'position', newPos)
updateLocalStorage() debounceLSUpdate()
} }
function _handleMouseUp(e: MouseEvent) { 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}`, zIndex: `${focusedItem.value == itemKey ? LayerEnum.CARD_ELEVATED : LayerEnum.CARD}`,
top: `${item.position.y}px`, top: `${item.position.y}px`,
left: `${item.position.x}px`, left: `${item.position.x}px`,
maxWidth: '300px', width: `${item.dimensions.w}px`,
height: `${item.dimensions.h}px`,
backgroundColor: '#181818' 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) => { <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.removeImage(item.id)
ImagesSignal.default.images.notify() ImagesSignal.default.images.notify()
updateLocalStorage() debounceLSUpdate()
}}>x</button> }}>x</button>
<img <img
src={item.contents} src={item.contents}

View File

@ -46,6 +46,7 @@ export function MiniMap() {
{Object.keys(images.images.value).map((imageKey: ImageCardType['id']) => { {Object.keys(images.images.value).map((imageKey: ImageCardType['id']) => {
const image = images.images.value[imageKey] const image = images.images.value[imageKey]
const el = useRef(null)
function _handleItemClick(_e: MouseEvent) { function _handleItemClick(_e: MouseEvent) {
window.scrollTo({ window.scrollTo({
@ -56,7 +57,7 @@ export function MiniMap() {
} }
return ( 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} onclick={_handleItemClick}
style={{ style={{
position: 'absolute', position: 'absolute',

View File

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

View File

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