-
+
{formatTimestamp(event.created_at)}
diff --git a/src/app/components/SignUp.svelte b/src/app/components/SignUp.svelte
index 7c110632..1bbaf544 100644
--- a/src/app/components/SignUp.svelte
+++ b/src/app/components/SignUp.svelte
@@ -7,7 +7,7 @@
import Spinner from "@lib/components/Spinner.svelte"
import LogIn from "@app/components/LogIn.svelte"
import InfoNostr from "@app/components/LogIn.svelte"
- import {pushModal, clearModal} from "@app/modal"
+ import {pushModal, clearModals} from "@app/modal"
import {pushToast} from "@app/toast"
const login = () => pushModal(LogIn)
@@ -38,7 +38,7 @@
if (await loginBroker.connect("", nip46Perms)) {
addSession({method: "nip46", pubkey, secret, handler})
pushToast({message: "Successfully logged in!"})
- clearModal()
+ clearModals()
} else {
pushToast({
theme: "error",
diff --git a/src/app/components/SpaceJoin.svelte b/src/app/components/SpaceJoin.svelte
index eeb5bbbf..ec2bd8a8 100644
--- a/src/app/components/SpaceJoin.svelte
+++ b/src/app/components/SpaceJoin.svelte
@@ -5,7 +5,7 @@
import Icon from "@lib/components/Icon.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte"
- import {clearModal} from "@app/modal"
+ import {clearModals} from "@app/modal"
import {addSpaceMembership} from "@app/commands"
export let url
@@ -15,7 +15,7 @@
const tryJoin = async () => {
await addSpaceMembership(url)
- clearModal()
+ clearModals()
}
const join = async () => {
diff --git a/src/app/components/ThreadCreate.svelte b/src/app/components/ThreadCreate.svelte
index 4fa2b0d9..5f583946 100644
--- a/src/app/components/ThreadCreate.svelte
+++ b/src/app/components/ThreadCreate.svelte
@@ -11,7 +11,6 @@
import ModalFooter from "@lib/components/ModalFooter.svelte"
import {getPubkeyHints} from "@app/commands"
import {getEditorOptions, addFile, uploadFiles, getEditorTags} from "@lib/editor"
- import {clearModal} from "@app/modal"
export let url
@@ -25,7 +24,7 @@
const event = createEvent(NOTE, {content: $editor.getText(), tags: getEditorTags($editor)})
publishThunk({event, relays: [url]})
- clearModal()
+ history.back()
}
let editor: Readable
diff --git a/src/app/modal.ts b/src/app/modal.ts
index c8642001..c474987d 100644
--- a/src/app/modal.ts
+++ b/src/app/modal.ts
@@ -1,15 +1,23 @@
import type {ComponentType} from "svelte"
-import {randomId, Emitter} from "@welshman/lib"
+import {writable} from "svelte/store"
+import {randomId, always, assoc, Emitter} from "@welshman/lib"
import {goto} from "$app/navigation"
-export const emitter = new Emitter()
-
-export const modals = new Map()
-
export type ModalOptions = {
drawer?: boolean
}
+export type Modal = {
+ id: string
+ component: ComponentType
+ props: Record
+ options: ModalOptions
+}
+
+export const emitter = new Emitter()
+
+export const modals = writable>({})
+
export const pushModal = (
component: ComponentType,
props: Record = {},
@@ -17,7 +25,7 @@ export const pushModal = (
) => {
const id = randomId()
- modals.set(id, {component, props, options})
+ modals.update(assoc(id, {id, component, props, options}))
goto("#" + id)
@@ -30,8 +38,7 @@ export const pushDrawer = (
options: ModalOptions = {},
) => pushModal(component, props, {...options, drawer: true})
-export const clearModal = () => {
- goto("#")
- modals.clear()
+export const clearModals = () => {
+ modals.update(always({}))
emitter.emit("close")
}
diff --git a/src/app/state.ts b/src/app/state.ts
index 948966e5..2400ce09 100644
--- a/src/app/state.ts
+++ b/src/app/state.ts
@@ -187,7 +187,7 @@ setContext({
return false
}
- const roomTags = event.tags.filter(nthEq(0, '~'))
+ const roomTags = event.tags.filter(nthEq(0, "~"))
if (roomTags.length > 0 && !roomTags.some(nthEq(2, url))) {
return false
@@ -268,7 +268,7 @@ export const {
// Messages
export type ChannelMessage = {
- url: string,
+ url: string
room: string
event: TrustedEvent
}
diff --git a/src/lib/components/Dialog.svelte b/src/lib/components/Dialog.svelte
new file mode 100644
index 00000000..a5a25cc7
--- /dev/null
+++ b/src/lib/components/Dialog.svelte
@@ -0,0 +1,18 @@
+
+
+
diff --git a/src/lib/components/Drawer.svelte b/src/lib/components/Drawer.svelte
index 5a432cc5..c1102171 100644
--- a/src/lib/components/Drawer.svelte
+++ b/src/lib/components/Drawer.svelte
@@ -1,37 +1,17 @@
-
-
-
-
-
-
-
-
+
+
+
diff --git a/src/lib/components/ModalFooter.svelte b/src/lib/components/ModalFooter.svelte
index 00262122..927beacb 100644
--- a/src/lib/components/ModalFooter.svelte
+++ b/src/lib/components/ModalFooter.svelte
@@ -1,3 +1,3 @@
-
+
diff --git a/src/lib/transition.ts b/src/lib/transition.ts
index fe8e6444..d3084f4c 100644
--- a/src/lib/transition.ts
+++ b/src/lib/transition.ts
@@ -1,5 +1,5 @@
// @ts-nocheck
-import {cubicOut} from 'svelte/easing'
+import {cubicOut} from "svelte/easing"
import type {FlyParams} from "svelte/transition"
import {fly as baseFly} from "svelte/transition"
@@ -9,38 +9,40 @@ export const fly = (node: Element, params?: FlyParams | undefined) =>
baseFly(node, {y: 20, ...params})
// Copy-pasted and tweaked from slide source code
-export function slideAndFade(node: any, { delay = 0, duration = 400, easing = cubicOut, axis = 'y' } = {}) {
- const style = getComputedStyle(node)
- const opacity = +style.opacity
- const primary_property = axis === 'y' ? 'height' : 'width'
- const primary_property_value = parseFloat(style[primary_property])
- const secondary_properties = axis === 'y' ? ['top', 'bottom'] : ['left', 'right']
- const capitalized_secondary_properties = secondary_properties.map(
- (e: string) => `${e[0].toUpperCase()}${e.slice(1)}`
- )
- const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`])
- const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`])
- const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`])
- const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`])
- const border_width_start_value = parseFloat(
- style[`border${capitalized_secondary_properties[0]}Width`]
- )
- const border_width_end_value = parseFloat(
- style[`border${capitalized_secondary_properties[1]}Width`]
- )
- return {
- delay,
- duration,
- easing,
- css: (t: number) =>
- 'overflow: hidden;' +
- `opacity: ${t};` +
- `${primary_property}: ${t * primary_property_value}px;` +
- `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` +
- `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` +
- `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` +
- `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` +
- `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` +
- `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`
- }
+export function slideAndFade(
+ node: any,
+ {delay = 0, duration = 400, easing = cubicOut, axis = "y"} = {},
+) {
+ const style = getComputedStyle(node)
+ const primary_property = axis === "y" ? "height" : "width"
+ const primary_property_value = parseFloat(style[primary_property])
+ const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"]
+ const capitalized_secondary_properties = secondary_properties.map(
+ (e: string) => `${e[0].toUpperCase()}${e.slice(1)}`,
+ )
+ const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`])
+ const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`])
+ const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`])
+ const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`])
+ const border_width_start_value = parseFloat(
+ style[`border${capitalized_secondary_properties[0]}Width`],
+ )
+ const border_width_end_value = parseFloat(
+ style[`border${capitalized_secondary_properties[1]}Width`],
+ )
+ return {
+ delay,
+ duration,
+ easing,
+ css: (t: number) =>
+ "overflow: hidden;" +
+ `opacity: ${t};` +
+ `${primary_property}: ${t * primary_property_value}px;` +
+ `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` +
+ `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` +
+ `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` +
+ `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` +
+ `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` +
+ `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`,
+ }
}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 350e24ee..282f5261 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -2,9 +2,6 @@
import "@src/app.css"
import {onMount} from "svelte"
import {get} from "svelte/store"
- import {page} from "$app/stores"
- import {goto} from "$app/navigation"
- import {browser} from "$app/environment"
import {sleep, take, sortBy, ago, now, HOUR} from "@welshman/lib"
import type {TrustedEvent} from "@welshman/util"
import {
@@ -26,7 +23,6 @@
db,
initStorage,
repository,
- session,
pubkey,
publishStatusData,
plaintext,
@@ -39,7 +35,6 @@
import * as app from "@welshman/app"
import AppContainer from "@app/components/AppContainer.svelte"
import ModalContainer from "@app/components/ModalContainer.svelte"
- import {modals, clearModal} from "@app/modal"
import {theme} from "@app/theme"
import {INDEXER_RELAYS} from "@app/state"
import {loadUserData} from "@app/commands"