Add contributing file, rename some files

This commit is contained in:
Jon Staab
2025-08-21 15:01:31 -07:00
parent d4943daa82
commit ba80ebac63
155 changed files with 438 additions and 349 deletions
-26
View File
@@ -1,26 +0,0 @@
## Project Overview
Flotilla is a Discord-like Nostr client that operates on the concept of "relays as groups/spaces." Built with SvelteKit 2.5 and Svelte 5, it provides messaging, threads, calendar events, and social features across Nostr relays.
## Important Patterns
### Finding Code
- Prefer navigating from one file to the next following imports when possible
- If search is necessary, use `ack`, not `grep` or `rg`.
### Nostr Event Handling
- Prefer seconds to milliseconds when handling nostr events.
### Styling Conventions
- When styling html, prefer flex/gap classes over margin or space-y classes.
### Room/space memberships
Memberships are surfaced as "bookmarks" to the user.
```typescript
import {membershipsByPubkey, getMembershipUrls} from '@app/state'
const spaces = getMembershipUrls($membershipsByPubkey.get(pubkey))
const rooms = getMembershipRooms($membershipsByPubkey.get(pubkey))
```
+96
View File
@@ -0,0 +1,96 @@
# Contributing guidelines
## Project Overview
Flotilla is a svelte/typescript/capacitor project. It's intended to be an alternative to Discord for Nostr users. A high-quality UX is a priority, with an emphasis on well-tested, intuitive designs, and robust implementations.
## Getting Started
Run `pnpm run dev` to get a dev server, and `pnpm run check:watch` to watch for typescript errors. When you're ready to commit, a pre-commit hook will run to lint and typecheck your work. To run the project on Android or iOS, use Android Studio or Xcode.
The `master` branch is automatically deployed to production, so always work on feature branches based on the `dev` branch. This project frequently uses unreleased versions of [welshman](https://welshman.coracle.social), using `pnpm` link to hotlink a local copy of the code. To set that up, clone welshman to the parent directory of your `coracle` client, then add `link:../welshman/packages/packagename` to the `pnpm.overrides` section of your `package.json`. Below is a nodejs script that will do that automatically for you:
```javascript
#!/usr/bin/env node
import fs from 'fs'
import path from 'path'
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'))
packageJson.pnpm.overrides = Object.keys(packageJson.dependencies)
.filter(pkg => pkg.startsWith('@welshman/'))
.reduce((acc, pkg) => {
const packageName = pkg.split('/')[1]
acc[pkg] = `link:../welshman/packages/${packageName}`
return acc
}, {})
fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2) + '\n')
console.log('Added welshman package overrides.')
```
Be sure to avoid committing overrides to either `package.json` or `pnpm-lock.yaml`. These overrides can generally be added, installed, and removed, and will persist until another `pnpm install` command gets run.
## File Structure
The main parts of the application are as follows:
- `static` - static assets like fonts, images, etc.
- `src/assets` - svgs for use as icons.
- `src/lib` - general purpose components and utilities.
- `src/app/core/state` - environment variables, constants, custom stores, and some utilities derived from them.
- `src/app/core/requests` - utilities related to loading data from the nostr network.
- `src/app/core/commands` - utilities related to publishing nostr events and uploading media to blossom servers.
- `src/app/utils` - other application logic, including stuff related to modals, routing, etc.
- `src/app/editor` - configuration for `@welshman/editor` for use in various app views.
- `src/app/components` - reusable components that depend on other `app` stuff.
- `src/routes` - file-based routing interpreted by sveltekit.
Application organization is based on an acyclic dependency graph:
- `routes` can depend on anything
- `app/components` can depend on anything in `app` or `lib`
- `app/utils` and `app/core` can only depend on `lib`
- `lib` (and everything else) can depend only on external libraries
The main stylistic/organizational rule when working in this project is that imports should be sorted based on the dependency graph. Third-party libraries should come first, then `lib`, then `app`.
## System Architecture
Flotilla's architecture generally mirrors the file structure. State is stored using Svelte `store`s provided either by `@welshman/app` or by `app/core/state`, allowing for idiomatic svelte 4 usage (svelte 5 runes are [ghey](https://habla.news/u/hodlbod@coracle.social/1739830562159) and not allowed outside of UI components).
State is then synchronized to local storage or indexeddb using storage helpers provided by welshman in `routes/+layout.svelte`. Other top level synchronization logic generally belongs there.
`app/core/state` contains all environment variables, constants, custom stores, and utilities derived from them. Most stores are `derived` from our event `repository` using `deriveEventsMapped`, which efficiently queries the repository and maps events to custom data structures. Some of these data structures are provided by `welshman`, and some are defined in `app/core/state`. In either case, they can always be mapped back to an event, which is important for updating replaceables without dropping unknown data.
Here are a few important domain objects:
- Spaces are relays used as community groups. Their `url`s are core to a lot of data and components, and are frequently passed around from place to place.
- Chats are direct message conversations. There is currently some ambiguity in routing, since relays that don't support NIP 29 also have a "chat" tab, which uses vanilla NIP-C7.
- NIP 29 groups are variously called "rooms" and "channels". Conventionally, a "room" is a group id, while a "channel" as an object representing the group's metadata.
- "Alerts" are records of requests the user has made to be notified, following [this NIP](https://github.com/nostr-protocol/nips/pull/1796)
`app/core/requests` contains utilities related to loading data from the nostr network. This might include feed manager utilities, loaders, or listeners.
`app/core/commands` contains utilities related to publishing nostr events and uploading media to blossom servers. This also includes utilities related to sending lighting payments, authenticating with relays, or probing relay policy. Event creation should generally be split into `make` functions which build the event, and `publish` functions which publish the event using `publishThunk`.
Any of these utilities can be included either in `app/components` or `routes`. Crucial to keep in mind is that nearly all global state runs through welshman's `repository` in a unidirectional way. To update state, run `publishThunk`, which immediately publishes the event to the local repository. State can be read from the repository using `deriveEventsMapped` or other utilities provided by welshman like `deriveProfile`.
Thunks are designed to reduce UI latency, handling signatures and delayed sending the background. In most cases, thunk status should be displayed to the user so that they can cancel sending or address errors.
Toast, modals, and sidebar dialogs are controlled in `app/util/modal` and `app/util/toast`. In both cases, component objects can be passed along with parameters, but care has to be taken that the calling component either doesn't unmount before the modal (as when one modal replaces another), or that `$state.snapshot` is appropriately called on any state runes. These components frequently run into weird svelte compiler bugs too, in which case you may have to do some silly things to cope.
## Issues and Pull Requests
All work by contributors should be done against an issue. If there is no issue for the work you're doing, please open one or ask the project owner to open one. All PRs should be opened against the `dev` branch (unless for hotfixes).
## Communication
Discussion about development is done [on Flotilla](https://app.flotilla.social/spaces/internal.coracle.social). The group is currently closed, so please let me know if you'd like access.
## Project License
This project is licensed under the MIT license. By contributing, you agree to waive all intellectual property rights to your contributions to this project.
+1 -1
View File
@@ -22,7 +22,7 @@ If you're deploying a custom version of flotilla, be sure to remove the `plausib
## Development ## Development
Run `pnpm run dev` to get a dev server, and `pnpm run check:watch` to watch for typescript errors. When you're ready to commit, a pre-commit hook will run to lint and typecheck your work. See [./CONTRIBUTING.md](CONTRIBUTING.md).
## Deployment ## Deployment
+6 -6
View File
@@ -27,12 +27,12 @@
userMembership, userMembership,
NOTIFIER_PUBKEY, NOTIFIER_PUBKEY,
NOTIFIER_RELAY, NOTIFIER_RELAY,
} from "@app/state" } from "@app/core/state"
import {loadAlertStatuses, requestRelayClaim} from "@app/requests" import {loadAlertStatuses, requestRelayClaim} from "@app/core/requests"
import {publishAlert, attemptAuth} from "@app/commands" import {publishAlert, attemptAuth} from "@app/core/commands"
import type {AlertParams} from "@app/commands" import type {AlertParams} from "@app/core/commands"
import {platform, platformName, canSendPushNotifications, getPushInfo} from "@app/push" import {platform, platformName, canSendPushNotifications, getPushInfo} from "@app/util/push"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
type Props = { type Props = {
url?: string url?: string
+4 -4
View File
@@ -1,9 +1,9 @@
<script lang="ts"> <script lang="ts">
import Confirm from "@lib/components/Confirm.svelte" import Confirm from "@lib/components/Confirm.svelte"
import type {Alert} from "@app/state" import type {Alert} from "@app/core/state"
import {NOTIFIER_RELAY, NOTIFIER_PUBKEY} from "@app/state" import {NOTIFIER_RELAY, NOTIFIER_PUBKEY} from "@app/core/state"
import {publishDelete} from "@app/commands" import {publishDelete} from "@app/core/commands"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
type Props = { type Props = {
alert: Alert alert: Alert
+3 -3
View File
@@ -5,9 +5,9 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import AlertDelete from "@app/components/AlertDelete.svelte" import AlertDelete from "@app/components/AlertDelete.svelte"
import type {Alert} from "@app/state" import type {Alert} from "@app/core/state"
import {deriveAlertStatus} from "@app/state" import {deriveAlertStatus} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
alert: Alert alert: Alert
+2 -2
View File
@@ -4,8 +4,8 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import AlertAdd from "@app/components/AlertAdd.svelte" import AlertAdd from "@app/components/AlertAdd.svelte"
import AlertItem from "@app/components/AlertItem.svelte" import AlertItem from "@app/components/AlertItem.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {alerts} from "@app/state" import {alerts} from "@app/core/state"
type Props = { type Props = {
url?: string url?: string
+2 -2
View File
@@ -7,8 +7,8 @@
import PrimaryNav from "@app/components/PrimaryNav.svelte" import PrimaryNav from "@app/components/PrimaryNav.svelte"
import EmailConfirm from "@app/components/EmailConfirm.svelte" import EmailConfirm from "@app/components/EmailConfirm.svelte"
import PasswordReset from "@app/components/PasswordReset.svelte" import PasswordReset from "@app/components/PasswordReset.svelte"
import {BURROW_URL} from "@app/state" import {BURROW_URL} from "@app/core/state"
import {modals, pushModal} from "@app/modal" import {modals, pushModal} from "@app/util/modal"
interface Props { interface Props {
children: Snippet children: Snippet
+1 -1
View File
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import QRCode from "@app/components/QRCode.svelte" import QRCode from "@app/components/QRCode.svelte"
import type {Nip46Controller} from "@app/nip46" import type {Nip46Controller} from "@app/util/nip46"
type Props = { type Props = {
controller: Nip46Controller controller: Nip46Controller
+2 -2
View File
@@ -5,8 +5,8 @@
import Field from "@lib/components/Field.svelte" import Field from "@lib/components/Field.svelte"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import InfoBunker from "@app/components/InfoBunker.svelte" import InfoBunker from "@app/components/InfoBunker.svelte"
import type {Nip46Controller} from "@app/nip46" import type {Nip46Controller} from "@app/util/nip46"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
controller: Nip46Controller controller: Nip46Controller
@@ -8,9 +8,9 @@
import EventActivity from "@app/components/EventActivity.svelte" import EventActivity from "@app/components/EventActivity.svelte"
import EventActions from "@app/components/EventActions.svelte" import EventActions from "@app/components/EventActions.svelte"
import CalendarEventEdit from "@app/components/CalendarEventEdit.svelte" import CalendarEventEdit from "@app/components/CalendarEventEdit.svelte"
import {publishDelete, publishReaction, canEnforceNip70} from "@app/commands" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands"
import {makeCalendarPath} from "@app/routes" import {makeCalendarPath} from "@app/util/routes"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const { const {
url, url,
+3 -3
View File
@@ -13,10 +13,10 @@
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import DateTimeInput from "@lib/components/DateTimeInput.svelte" import DateTimeInput from "@lib/components/DateTimeInput.svelte"
import EditorContent from "@app/editor/EditorContent.svelte" import EditorContent from "@app/editor/EditorContent.svelte"
import {PROTECTED} from "@app/state" import {PROTECTED} from "@app/core/state"
import {makeEditor} from "@app/editor" import {makeEditor} from "@app/editor"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {canEnforceNip70} from "@app/commands" import {canEnforceNip70} from "@app/core/commands"
type Props = { type Props = {
url: string url: string
+1 -1
View File
@@ -4,7 +4,7 @@
import CalendarEventActions from "@app/components/CalendarEventActions.svelte" import CalendarEventActions from "@app/components/CalendarEventActions.svelte"
import CalendarEventHeader from "@app/components/CalendarEventHeader.svelte" import CalendarEventHeader from "@app/components/CalendarEventHeader.svelte"
import ProfileLink from "@app/components/ProfileLink.svelte" import ProfileLink from "@app/components/ProfileLink.svelte"
import {makeCalendarPath} from "@app/routes" import {makeCalendarPath} from "@app/util/routes"
type Props = { type Props = {
url: string url: string
+3 -3
View File
@@ -15,9 +15,9 @@
import ChannelMessageEmojiButton from "@app/components/ChannelMessageEmojiButton.svelte" import ChannelMessageEmojiButton from "@app/components/ChannelMessageEmojiButton.svelte"
import ChannelMessageMenuButton from "@app/components/ChannelMessageMenuButton.svelte" import ChannelMessageMenuButton from "@app/components/ChannelMessageMenuButton.svelte"
import ChannelMessageMenuMobile from "@app/components/ChannelMessageMenuMobile.svelte" import ChannelMessageMenuMobile from "@app/components/ChannelMessageMenuMobile.svelte"
import {colors, ENABLE_ZAPS} from "@app/state" import {colors, ENABLE_ZAPS} from "@app/core/state"
import {publishDelete, publishReaction, canEnforceNip70} from "@app/commands" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
interface Props { interface Props {
url: string url: string
@@ -2,7 +2,7 @@
import type {NativeEmoji} from "emoji-picker-element/shared" import type {NativeEmoji} from "emoji-picker-element/shared"
import EmojiButton from "@lib/components/EmojiButton.svelte" import EmojiButton from "@lib/components/EmojiButton.svelte"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import {publishReaction, canEnforceNip70} from "@app/commands" import {publishReaction, canEnforceNip70} from "@app/core/commands"
const {url, event} = $props() const {url, event} = $props()
+1 -1
View File
@@ -5,7 +5,7 @@
import EventInfo from "@app/components/EventInfo.svelte" import EventInfo from "@app/components/EventInfo.svelte"
import EventReport from "@app/components/EventReport.svelte" import EventReport from "@app/components/EventReport.svelte"
import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte" import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {url, event, onClick} = $props() const {url, event, onClick} = $props()
@@ -8,9 +8,9 @@
import ZapButton from "@app/components/ZapButton.svelte" import ZapButton from "@app/components/ZapButton.svelte"
import EventInfo from "@app/components/EventInfo.svelte" import EventInfo from "@app/components/EventInfo.svelte"
import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte" import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte"
import {ENABLE_ZAPS} from "@app/state" import {ENABLE_ZAPS} from "@app/core/state"
import {publishReaction, canEnforceNip70} from "@app/commands" import {publishReaction, canEnforceNip70} from "@app/core/commands"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
url: string url: string
+1 -1
View File
@@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import {channelsById, makeChannelId} from "@app/state" import {channelsById, makeChannelId} from "@app/core/state"
const {url, room} = $props() const {url, room} = $props()
</script> </script>
+4 -4
View File
@@ -53,10 +53,10 @@
deriveChat, deriveChat,
splitChatId, splitChatId,
PLATFORM_NAME, PLATFORM_NAME,
} from "@app/state" } from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {prependParent} from "@app/commands" import {prependParent} from "@app/core/commands"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
type Props = { type Props = {
id: string id: string
+2 -2
View File
@@ -8,8 +8,8 @@
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {canDecrypt, PLATFORM_NAME, ensureUnwrapped} from "@app/state" import {canDecrypt, PLATFORM_NAME, ensureUnwrapped} from "@app/core/state"
import {clearModals} from "@app/modal" import {clearModals} from "@app/util/modal"
const {next} = $props() const {next} = $props()
+2 -2
View File
@@ -9,8 +9,8 @@
import ProfileName from "@app/components/ProfileName.svelte" import ProfileName from "@app/components/ProfileName.svelte"
import ProfileCircle from "@app/components/ProfileCircle.svelte" import ProfileCircle from "@app/components/ProfileCircle.svelte"
import ProfileCircles from "@app/components/ProfileCircles.svelte" import ProfileCircles from "@app/components/ProfileCircles.svelte"
import {makeChatPath} from "@app/routes" import {makeChatPath} from "@app/util/routes"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
interface Props { interface Props {
id: string id: string
+2 -2
View File
@@ -2,8 +2,8 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ChatStart from "@app/components/ChatStart.svelte" import ChatStart from "@app/components/ChatStart.svelte"
import {setChecked} from "@app/notifications" import {setChecked} from "@app/util/notifications"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const startChat = () => pushModal(ChatStart, {}, {replaceState: true}) const startChat = () => pushModal(ChatStart, {}, {replaceState: true})
+3 -3
View File
@@ -15,9 +15,9 @@
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import ChatMessageMenu from "@app/components/ChatMessageMenu.svelte" import ChatMessageMenu from "@app/components/ChatMessageMenu.svelte"
import ChatMessageMenuMobile from "@app/components/ChatMessageMenuMobile.svelte" import ChatMessageMenuMobile from "@app/components/ChatMessageMenuMobile.svelte"
import {colors} from "@app/state" import {colors} from "@app/core/state"
import {makeDelete, makeReaction} from "@app/commands" import {makeDelete, makeReaction} from "@app/core/commands"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
interface Props { interface Props {
event: TrustedEvent event: TrustedEvent
@@ -4,7 +4,7 @@
import {sendWrapped} from "@welshman/app" import {sendWrapped} from "@welshman/app"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import EmojiButton from "@lib/components/EmojiButton.svelte" import EmojiButton from "@lib/components/EmojiButton.svelte"
import {makeReaction} from "@app/commands" import {makeReaction} from "@app/core/commands"
interface Props { interface Props {
event: TrustedEvent event: TrustedEvent
+1 -1
View File
@@ -3,7 +3,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ChatMessageEmojiButton from "@app/components/ChatMessageEmojiButton.svelte" import ChatMessageEmojiButton from "@app/components/ChatMessageEmojiButton.svelte"
import EventInfo from "@app/components/EventInfo.svelte" import EventInfo from "@app/components/EventInfo.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {event, pubkeys, popover, replyTo} = $props() const {event, pubkeys, popover, replyTo} = $props()
@@ -6,9 +6,9 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import EmojiPicker from "@lib/components/EmojiPicker.svelte" import EmojiPicker from "@lib/components/EmojiPicker.svelte"
import EventInfo from "@app/components/EventInfo.svelte" import EventInfo from "@app/components/EventInfo.svelte"
import {makeReaction} from "@app/commands" import {makeReaction} from "@app/core/commands"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
type Props = { type Props = {
pubkeys: string[] pubkeys: string[]
+1 -1
View File
@@ -13,7 +13,7 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte" import ProfileMultiSelect from "@app/components/ProfileMultiSelect.svelte"
import {makeChatPath} from "@app/routes" import {makeChatPath} from "@app/util/routes"
const back = () => history.back() const back = () => history.back()
+2 -2
View File
@@ -4,8 +4,8 @@
import ThunkStatusOrDeleted from "@app/components/ThunkStatusOrDeleted.svelte" import ThunkStatusOrDeleted from "@app/components/ThunkStatusOrDeleted.svelte"
import EventActivity from "@app/components/EventActivity.svelte" import EventActivity from "@app/components/EventActivity.svelte"
import EventActions from "@app/components/EventActions.svelte" import EventActions from "@app/components/EventActions.svelte"
import {publishDelete, publishReaction, canEnforceNip70} from "@app/commands" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands"
import {makeThreadPath} from "@app/routes" import {makeThreadPath} from "@app/util/routes"
interface Props { interface Props {
url: any url: any
+1 -1
View File
@@ -31,7 +31,7 @@
import ContentQuote from "@app/components/ContentQuote.svelte" import ContentQuote from "@app/components/ContentQuote.svelte"
import ContentTopic from "@app/components/ContentTopic.svelte" import ContentTopic from "@app/components/ContentTopic.svelte"
import ContentMention from "@app/components/ContentMention.svelte" import ContentMention from "@app/components/ContentMention.svelte"
import {entityLink, userSettingValues} from "@app/state" import {entityLink, userSettingValues} from "@app/core/state"
interface Props { interface Props {
event: any event: any
+1 -1
View File
@@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import type {ParsedEmojiValue} from "@welshman/content" import type {ParsedEmojiValue} from "@welshman/content"
import {imgproxy} from "@app/state" import {imgproxy} from "@app/core/state"
export let value: ParsedEmojiValue export let value: ParsedEmojiValue
+2 -2
View File
@@ -1,11 +1,11 @@
<script lang="ts"> <script lang="ts">
import {ellipsize, displayUrl, postJson} from "@welshman/lib" import {ellipsize, displayUrl, postJson} from "@welshman/lib"
import {dufflepud, imgproxy} from "@app/state" import {dufflepud, imgproxy} from "@app/core/state"
import {preventDefault, stopPropagation} from "@lib/html" import {preventDefault, stopPropagation} from "@lib/html"
import Link from "@lib/components/Link.svelte" import Link from "@lib/components/Link.svelte"
import ContentLinkDetail from "@app/components/ContentLinkDetail.svelte" import ContentLinkDetail from "@app/components/ContentLinkDetail.svelte"
import ContentLinkBlockImage from "@app/components/ContentLinkBlockImage.svelte" import ContentLinkBlockImage from "@app/components/ContentLinkBlockImage.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {value, event} = $props() const {value, event} = $props()
@@ -3,7 +3,7 @@
import {displayUrl} from "@welshman/lib" import {displayUrl} from "@welshman/lib"
import {getTags, decryptFile, getTagValue, tagsFromIMeta} from "@welshman/util" import {getTags, decryptFile, getTagValue, tagsFromIMeta} from "@welshman/util"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import {imgproxy} from "@app/state" import {imgproxy} from "@app/core/state"
const {value, event, ...props} = $props() const {value, event, ...props} = $props()
+1 -1
View File
@@ -4,7 +4,7 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Link from "@lib/components/Link.svelte" import Link from "@lib/components/Link.svelte"
import ContentLinkDetail from "@app/components/ContentLinkDetail.svelte" import ContentLinkDetail from "@app/components/ContentLinkDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {value} = $props() const {value} = $props()
+1 -1
View File
@@ -4,7 +4,7 @@
import {deriveProfileDisplay} from "@welshman/app" import {deriveProfileDisplay} from "@welshman/app"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
value: ProfilePointer value: ProfilePointer
+2 -2
View File
@@ -7,8 +7,8 @@
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import NoteCard from "@app/components/NoteCard.svelte" import NoteCard from "@app/components/NoteCard.svelte"
import NoteContent from "@app/components/NoteContent.svelte" import NoteContent from "@app/components/NoteContent.svelte"
import {deriveEvent, entityLink} from "@app/state" import {deriveEvent, entityLink} from "@app/core/state"
import {goToEvent} from "@app/routes" import {goToEvent} from "@app/util/routes"
type Props = { type Props = {
value: any value: any
+1 -1
View File
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
const {value} = $props() const {value} = $props()
+2 -2
View File
@@ -6,8 +6,8 @@
import Content from "@app/components/Content.svelte" import Content from "@app/components/Content.svelte"
import ProfileCircle from "@app/components/ProfileCircle.svelte" import ProfileCircle from "@app/components/ProfileCircle.svelte"
import ProfileCircles from "@app/components/ProfileCircles.svelte" import ProfileCircles from "@app/components/ProfileCircles.svelte"
import {goToEvent} from "@app/routes" import {goToEvent} from "@app/util/routes"
import {displayChannel} from "@app/state" import {displayChannel} from "@app/core/state"
type Props = { type Props = {
url: string url: string
+2 -2
View File
@@ -4,8 +4,8 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import LogInPassword from "@app/components/LogInPassword.svelte" import LogInPassword from "@app/components/LogInPassword.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {BURROW_URL} from "@app/state" import {BURROW_URL} from "@app/core/state"
const {email, confirm_token} = $props() const {email, confirm_token} = $props()
+2 -2
View File
@@ -9,8 +9,8 @@
import ZapButton from "@app/components/ZapButton.svelte" import ZapButton from "@app/components/ZapButton.svelte"
import EmojiButton from "@lib/components/EmojiButton.svelte" import EmojiButton from "@lib/components/EmojiButton.svelte"
import EventMenu from "@app/components/EventMenu.svelte" import EventMenu from "@app/components/EventMenu.svelte"
import {ENABLE_ZAPS} from "@app/state" import {ENABLE_ZAPS} from "@app/core/state"
import {publishReaction, canEnforceNip70} from "@app/commands" import {publishReaction, canEnforceNip70} from "@app/core/commands"
type Props = { type Props = {
url: string url: string
+1 -1
View File
@@ -6,7 +6,7 @@
import {deriveEvents} from "@welshman/store" import {deriveEvents} from "@welshman/store"
import type {TrustedEvent} from "@welshman/util" import type {TrustedEvent} from "@welshman/util"
import {repository} from "@welshman/app" import {repository} from "@welshman/app"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
const {url, path, event}: {url: string; path: string; event: TrustedEvent} = $props() const {url, path, event}: {url: string; path: string; event: TrustedEvent} = $props()
+2 -2
View File
@@ -1,8 +1,8 @@
<script lang="ts"> <script lang="ts">
import type {TrustedEvent} from "@welshman/util" import type {TrustedEvent} from "@welshman/util"
import Confirm from "@lib/components/Confirm.svelte" import Confirm from "@lib/components/Confirm.svelte"
import {publishDelete, canEnforceNip70} from "@app/commands" import {publishDelete, canEnforceNip70} from "@app/core/commands"
import {clearModals} from "@app/modal" import {clearModals} from "@app/util/modal"
type Props = { type Props = {
url: string url: string
+2 -2
View File
@@ -8,8 +8,8 @@
import FieldInline from "@lib/components/FieldInline.svelte" import FieldInline from "@lib/components/FieldInline.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import {trackerStore} from "@app/state" import {trackerStore} from "@app/core/state"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
type Props = { type Props = {
url?: string url?: string
+1 -1
View File
@@ -10,7 +10,7 @@
import EventReport from "@app/components/EventReport.svelte" import EventReport from "@app/components/EventReport.svelte"
import EventShare from "@app/components/EventShare.svelte" import EventShare from "@app/components/EventShare.svelte"
import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte" import EventDeleteConfirm from "@app/components/EventDeleteConfirm.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
url: string url: string
+3 -3
View File
@@ -7,10 +7,10 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import EditorContent from "@app/editor/EditorContent.svelte" import EditorContent from "@app/editor/EditorContent.svelte"
import {publishComment, canEnforceNip70} from "@app/commands" import {publishComment, canEnforceNip70} from "@app/core/commands"
import {PROTECTED} from "@app/state" import {PROTECTED} from "@app/core/state"
import {makeEditor} from "@app/editor" import {makeEditor} from "@app/editor"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
const {url, event, onClose, onSubmit} = $props() const {url, event, onClose, onSubmit} = $props()
+2 -2
View File
@@ -6,8 +6,8 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {publishReport} from "@app/commands" import {publishReport} from "@app/core/commands"
const {url, event} = $props() const {url, event} = $props()
+1 -1
View File
@@ -6,7 +6,7 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import Profile from "@app/components/Profile.svelte" import Profile from "@app/components/Profile.svelte"
import {publishDelete, canEnforceNip70} from "@app/commands" import {publishDelete, canEnforceNip70} from "@app/core/commands"
const {url, event} = $props() const {url, event} = $props()
+3 -3
View File
@@ -7,9 +7,9 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import ChannelName from "@app/components/ChannelName.svelte" import ChannelName from "@app/components/ChannelName.svelte"
import {channelsByUrl} from "@app/state" import {channelsByUrl} from "@app/core/state"
import {makeRoomPath} from "@app/routes" import {makeRoomPath} from "@app/util/routes"
import {setKey} from "@app/implicit" import {setKey} from "@lib/implicit"
const {url, noun, event}: {url: string; noun: string; event: TrustedEvent} = $props() const {url, noun, event}: {url: string; noun: string; event: TrustedEvent} = $props()
+2 -2
View File
@@ -4,8 +4,8 @@
import ThunkStatusOrDeleted from "@app/components/ThunkStatusOrDeleted.svelte" import ThunkStatusOrDeleted from "@app/components/ThunkStatusOrDeleted.svelte"
import EventActivity from "@app/components/EventActivity.svelte" import EventActivity from "@app/components/EventActivity.svelte"
import EventActions from "@app/components/EventActions.svelte" import EventActions from "@app/components/EventActions.svelte"
import {publishDelete, publishReaction, canEnforceNip70} from "@app/commands" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands"
import {makeGoalPath} from "@app/routes" import {makeGoalPath} from "@app/util/routes"
interface Props { interface Props {
url: any url: any
+3 -3
View File
@@ -10,10 +10,10 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import EditorContent from "@app/editor/EditorContent.svelte" import EditorContent from "@app/editor/EditorContent.svelte"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {PROTECTED} from "@app/state" import {PROTECTED} from "@app/core/state"
import {makeEditor} from "@app/editor" import {makeEditor} from "@app/editor"
import {canEnforceNip70} from "@app/commands" import {canEnforceNip70} from "@app/core/commands"
const {url} = $props() const {url} = $props()
+1 -1
View File
@@ -6,7 +6,7 @@
import ProfileLink from "@app/components/ProfileLink.svelte" import ProfileLink from "@app/components/ProfileLink.svelte"
import GoalActions from "@app/components/GoalActions.svelte" import GoalActions from "@app/components/GoalActions.svelte"
import GoalSummary from "@app/components/GoalSummary.svelte" import GoalSummary from "@app/components/GoalSummary.svelte"
import {makeGoalPath} from "@app/routes" import {makeGoalPath} from "@app/util/routes"
type Props = { type Props = {
url: string url: string
+1 -1
View File
@@ -2,7 +2,7 @@
import Link from "@lib/components/Link.svelte" import Link from "@lib/components/Link.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
</script> </script>
<div class="column gap-4"> <div class="column gap-4">
+1 -1
View File
@@ -2,7 +2,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import Link from "@lib/components/Link.svelte" import Link from "@lib/components/Link.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
</script> </script>
<div class="column gap-4"> <div class="column gap-4">
+2 -2
View File
@@ -6,8 +6,8 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import ProfileEject from "@app/components/ProfileEject.svelte" import ProfileEject from "@app/components/ProfileEject.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const back = () => history.back() const back = () => history.back()
+1 -1
View File
@@ -2,7 +2,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import Link from "@lib/components/Link.svelte" import Link from "@lib/components/Link.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
</script> </script>
<div class="column gap-4"> <div class="column gap-4">
+2 -2
View File
@@ -6,8 +6,8 @@
import CardButton from "@lib/components/CardButton.svelte" import CardButton from "@lib/components/CardButton.svelte"
import LogIn from "@app/components/LogIn.svelte" import LogIn from "@app/components/LogIn.svelte"
import SignUp from "@app/components/SignUp.svelte" import SignUp from "@app/components/SignUp.svelte"
import {PLATFORM_TERMS, PLATFORM_PRIVACY, PLATFORM_NAME} from "@app/state" import {PLATFORM_TERMS, PLATFORM_PRIVACY, PLATFORM_NAME} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const logIn = () => pushModal(LogIn) const logIn = () => pushModal(LogIn)
+5 -5
View File
@@ -10,11 +10,11 @@
import InfoNostr from "@app/components/InfoNostr.svelte" import InfoNostr from "@app/components/InfoNostr.svelte"
import LogInBunker from "@app/components/LogInBunker.svelte" import LogInBunker from "@app/components/LogInBunker.svelte"
import LogInPassword from "@app/components/LogInPassword.svelte" import LogInPassword from "@app/components/LogInPassword.svelte"
import {pushModal, clearModals} from "@app/modal" import {pushModal, clearModals} from "@app/util/modal"
import {PLATFORM_NAME, BURROW_URL} from "@app/state" import {PLATFORM_NAME, BURROW_URL} from "@app/core/state"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {loadUserData} from "@app/requests" import {loadUserData} from "@app/core/requests"
import {setChecked} from "@app/notifications" import {setChecked} from "@app/util/notifications"
let signers: any[] = $state([]) let signers: any[] = $state([])
let loading: string | undefined = $state() let loading: string | undefined = $state()
+6 -6
View File
@@ -11,12 +11,12 @@
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import BunkerConnect from "@app/components/BunkerConnect.svelte" import BunkerConnect from "@app/components/BunkerConnect.svelte"
import BunkerUrl from "@app/components/BunkerUrl.svelte" import BunkerUrl from "@app/components/BunkerUrl.svelte"
import {Nip46Controller} from "@app/nip46" import {Nip46Controller} from "@app/util/nip46"
import {loadUserData} from "@app/requests" import {loadUserData} from "@app/core/requests"
import {clearModals} from "@app/modal" import {clearModals} from "@app/util/modal"
import {setChecked} from "@app/notifications" import {setChecked} from "@app/util/notifications"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {SIGNER_RELAYS, NIP46_PERMS} from "@app/state" import {SIGNER_RELAYS, NIP46_PERMS} from "@app/core/state"
const back = () => { const back = () => {
if (mode === "connect") { if (mode === "connect") {
+11 -5
View File
@@ -12,11 +12,17 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import PasswordResetRequest from "@app/components/PasswordResetRequest.svelte" import PasswordResetRequest from "@app/components/PasswordResetRequest.svelte"
import {loadUserData} from "@app/requests" import {loadUserData} from "@app/core/requests"
import {clearModals, pushModal} from "@app/modal" import {clearModals, pushModal} from "@app/util/modal"
import {setChecked} from "@app/notifications" import {setChecked} from "@app/util/notifications"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {NIP46_PERMS, BURROW_URL, PLATFORM_URL, PLATFORM_NAME, PLATFORM_LOGO} from "@app/state" import {
NIP46_PERMS,
BURROW_URL,
PLATFORM_URL,
PLATFORM_NAME,
PLATFORM_LOGO,
} from "@app/core/state"
interface Props { interface Props {
email?: string email?: string
+1 -1
View File
@@ -5,7 +5,7 @@
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {logout} from "@app/commands" import {logout} from "@app/core/commands"
const back = () => history.back() const back = () => history.back()
+2 -2
View File
@@ -4,8 +4,8 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import CardButton from "@lib/components/CardButton.svelte" import CardButton from "@lib/components/CardButton.svelte"
import LogOut from "@app/components/LogOut.svelte" import LogOut from "@app/components/LogOut.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const logout = () => pushModal(LogOut) const logout = () => pushModal(LogOut)
</script> </script>
+4 -4
View File
@@ -26,10 +26,10 @@
deriveOtherRooms, deriveOtherRooms,
hasNip29, hasNip29,
alerts, alerts,
} from "@app/state" } from "@app/core/state"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
const {url} = $props() const {url} = $props()
+3 -3
View File
@@ -2,9 +2,9 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import MenuSpace from "@app/components/MenuSpace.svelte" import MenuSpace from "@app/components/MenuSpace.svelte"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {pushDrawer} from "@app/modal" import {pushDrawer} from "@app/util/modal"
const {url} = $props() const {url} = $props()
+3 -3
View File
@@ -2,9 +2,9 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import SecondaryNavItem from "@lib/components/SecondaryNavItem.svelte" import SecondaryNavItem from "@lib/components/SecondaryNavItem.svelte"
import ChannelName from "@app/components/ChannelName.svelte" import ChannelName from "@app/components/ChannelName.svelte"
import {makeRoomPath} from "@app/routes" import {makeRoomPath} from "@app/util/routes"
import {deriveChannel} from "@app/state" import {deriveChannel} from "@app/core/state"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
interface Props { interface Props {
url: any url: any
+2 -2
View File
@@ -5,8 +5,8 @@
import CardButton from "@lib/components/CardButton.svelte" import CardButton from "@lib/components/CardButton.svelte"
import MenuSpacesItem from "@app/components/MenuSpacesItem.svelte" import MenuSpacesItem from "@app/components/MenuSpacesItem.svelte"
import SpaceAdd from "@app/components/SpaceAdd.svelte" import SpaceAdd from "@app/components/SpaceAdd.svelte"
import {userRoomsByUrl, PLATFORM_RELAYS} from "@app/state" import {userRoomsByUrl, PLATFORM_RELAYS} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const addSpace = () => pushModal(SpaceAdd) const addSpace = () => pushModal(SpaceAdd)
</script> </script>
+2 -2
View File
@@ -4,8 +4,8 @@
import SpaceAvatar from "@app/components/SpaceAvatar.svelte" import SpaceAvatar from "@app/components/SpaceAvatar.svelte"
import RelayName from "@app/components/RelayName.svelte" import RelayName from "@app/components/RelayName.svelte"
import RelayDescription from "@app/components/RelayDescription.svelte" import RelayDescription from "@app/components/RelayDescription.svelte"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
const {url} = $props() const {url} = $props()
+1 -1
View File
@@ -2,7 +2,7 @@
import {page} from "$app/stores" import {page} from "$app/stores"
import Drawer from "@lib/components/Drawer.svelte" import Drawer from "@lib/components/Drawer.svelte"
import Dialog from "@lib/components/Dialog.svelte" import Dialog from "@lib/components/Dialog.svelte"
import {modals, clearModals} from "@app/modal" import {modals, clearModals} from "@app/util/modal"
const onKeyDown = (e: any) => { const onKeyDown = (e: any) => {
if (e.code === "Escape" && e.target === document.body) { if (e.code === "Escape" && e.target === document.body) {
+1 -1
View File
@@ -12,7 +12,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import Profile from "@app/components/Profile.svelte" import Profile from "@app/components/Profile.svelte"
import ProfileName from "@app/components/ProfileName.svelte" import ProfileName from "@app/components/ProfileName.svelte"
import {entityLink} from "@app/state" import {entityLink} from "@app/core/state"
const { const {
event, event,
+1 -1
View File
@@ -6,7 +6,7 @@
import NoteContent from "@app/components/NoteContent.svelte" import NoteContent from "@app/components/NoteContent.svelte"
import NoteCard from "@app/components/NoteCard.svelte" import NoteCard from "@app/components/NoteCard.svelte"
import ReactionSummary from "@app/components/ReactionSummary.svelte" import ReactionSummary from "@app/components/ReactionSummary.svelte"
import {publishDelete, publishReaction, canEnforceNip70} from "@app/commands" import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands"
const {url, event} = $props() const {url, event} = $props()
+3 -3
View File
@@ -7,9 +7,9 @@
import FieldInline from "@lib/components/FieldInline.svelte" import FieldInline from "@lib/components/FieldInline.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import LogInPassword from "@app/components/LogInPassword.svelte" import LogInPassword from "@app/components/LogInPassword.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {BURROW_URL} from "@app/state" import {BURROW_URL} from "@app/core/state"
const {email, reset_token} = $props() const {email, reset_token} = $props()
@@ -8,9 +8,9 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import LogInPassword from "@app/components/LogInPassword.svelte" import LogInPassword from "@app/components/LogInPassword.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {BURROW_URL} from "@app/state" import {BURROW_URL} from "@app/core/state"
interface Props { interface Props {
email: string email: string
+1 -1
View File
@@ -5,7 +5,7 @@
import ProfileInfo from "@app/components/ProfileInfo.svelte" import ProfileInfo from "@app/components/ProfileInfo.svelte"
import ProfileBadges from "@app/components/ProfileBadges.svelte" import ProfileBadges from "@app/components/ProfileBadges.svelte"
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
pubkey: string pubkey: string
+4 -4
View File
@@ -13,10 +13,10 @@
import MenuOtherSpaces from "@app/components/MenuOtherSpaces.svelte" import MenuOtherSpaces from "@app/components/MenuOtherSpaces.svelte"
import MenuSettings from "@app/components/MenuSettings.svelte" import MenuSettings from "@app/components/MenuSettings.svelte"
import PrimaryNavItemSpace from "@app/components/PrimaryNavItemSpace.svelte" import PrimaryNavItemSpace from "@app/components/PrimaryNavItemSpace.svelte"
import {userRoomsByUrl, canDecrypt, PLATFORM_RELAYS, PLATFORM_LOGO} from "@app/state" import {userRoomsByUrl, canDecrypt, PLATFORM_RELAYS, PLATFORM_LOGO} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
type Props = { type Props = {
children?: Snippet children?: Snippet
@@ -2,8 +2,8 @@
import {displayRelayUrl} from "@welshman/util" import {displayRelayUrl} from "@welshman/util"
import PrimaryNavItem from "@lib/components/PrimaryNavItem.svelte" import PrimaryNavItem from "@lib/components/PrimaryNavItem.svelte"
import SpaceAvatar from "@app/components/SpaceAvatar.svelte" import SpaceAvatar from "@app/components/SpaceAvatar.svelte"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {notifications} from "@app/notifications" import {notifications} from "@app/util/notifications"
const {url} = $props() const {url} = $props()
+2 -2
View File
@@ -13,8 +13,8 @@
import Avatar from "@lib/components/Avatar.svelte" import Avatar from "@lib/components/Avatar.svelte"
import WotScore from "@app/components/WotScore.svelte" import WotScore from "@app/components/WotScore.svelte"
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
type Props = { type Props = {
pubkey: string pubkey: string
+3 -3
View File
@@ -9,9 +9,9 @@
import {repository, loadRelaySelections} from "@welshman/app" import {repository, loadRelaySelections} from "@welshman/app"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ProfileSpaces from "@app/components/ProfileSpaces.svelte" import ProfileSpaces from "@app/components/ProfileSpaces.svelte"
import {membershipsByPubkey} from "@app/state" import {membershipsByPubkey} from "@app/core/state"
import {goToEvent} from "@app/routes" import {goToEvent} from "@app/util/routes"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
pubkey: string pubkey: string
+3 -3
View File
@@ -16,9 +16,9 @@
import Spinner from "@lib/components/Spinner.svelte" import Spinner from "@lib/components/Spinner.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {logout} from "@app/commands" import {logout} from "@app/core/commands"
import {INDEXER_RELAYS, PLATFORM_NAME, userMembership, getMembershipUrls} from "@app/state" import {INDEXER_RELAYS, PLATFORM_NAME, userMembership, getMembershipUrls} from "@app/core/state"
let progress: number | undefined = $state(undefined) let progress: number | undefined = $state(undefined)
let confirmText = $state("") let confirmText = $state("")
+3 -3
View File
@@ -9,9 +9,9 @@
import ProfileInfo from "@app/components/ProfileInfo.svelte" import ProfileInfo from "@app/components/ProfileInfo.svelte"
import ProfileBadges from "@app/components/ProfileBadges.svelte" import ProfileBadges from "@app/components/ProfileBadges.svelte"
import ChatEnable from "@app/components/ChatEnable.svelte" import ChatEnable from "@app/components/ChatEnable.svelte"
import {canDecrypt, pubkeyLink} from "@app/state" import {canDecrypt, pubkeyLink} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {makeChatPath} from "@app/routes" import {makeChatPath} from "@app/util/routes"
export type Props = { export type Props = {
pubkey: string pubkey: string
+3 -3
View File
@@ -14,9 +14,9 @@
import {pubkey, profilesByPubkey, publishThunk} from "@welshman/app" import {pubkey, profilesByPubkey, publishThunk} from "@welshman/app"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ProfileEditForm from "@app/components/ProfileEditForm.svelte" import ProfileEditForm from "@app/components/ProfileEditForm.svelte"
import {clearModals} from "@app/modal" import {clearModals} from "@app/util/modal"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {PROTECTED, getMembershipUrls, userMembership} from "@app/state" import {PROTECTED, getMembershipUrls, userMembership} from "@app/core/state"
const profile = $profilesByPubkey.get($pubkey!) || makeProfile() const profile = $profilesByPubkey.get($pubkey!) || makeProfile()
const shouldBroadcast = !getTag(PROTECTED, profile.event?.tags || []) const shouldBroadcast = !getTag(PROTECTED, profile.event?.tags || [])
+1 -1
View File
@@ -8,7 +8,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import InputProfilePicture from "@lib/components/InputProfilePicture.svelte" import InputProfilePicture from "@lib/components/InputProfilePicture.svelte"
import InfoHandle from "@app/components/InfoHandle.svelte" import InfoHandle from "@app/components/InfoHandle.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Values = { type Values = {
profile: Profile profile: Profile
+3 -3
View File
@@ -9,9 +9,9 @@
import Field from "@lib/components/Field.svelte" import Field from "@lib/components/Field.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {PLATFORM_NAME, BURROW_URL} from "@app/state" import {PLATFORM_NAME, BURROW_URL} from "@app/core/state"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {logout} from "@app/commands" import {logout} from "@app/core/commands"
const email = $session?.email const email = $session?.email
+1 -1
View File
@@ -4,7 +4,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ProfileName from "@app/components/ProfileName.svelte" import ProfileName from "@app/components/ProfileName.svelte"
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
pubkey: string pubkey: string
+1 -1
View File
@@ -11,7 +11,7 @@
import ProfileSuggestion from "@app/editor/ProfileSuggestion.svelte" import ProfileSuggestion from "@app/editor/ProfileSuggestion.svelte"
import ProfileName from "@app/components/ProfileName.svelte" import ProfileName from "@app/components/ProfileName.svelte"
import ProfileDetail from "@app/components/ProfileDetail.svelte" import ProfileDetail from "@app/components/ProfileDetail.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
interface Props { interface Props {
value: string[] value: string[]
+2 -2
View File
@@ -5,8 +5,8 @@
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SpaceAvatar from "@app/components/SpaceAvatar.svelte" import SpaceAvatar from "@app/components/SpaceAvatar.svelte"
import RelayName from "@app/components/RelayName.svelte" import RelayName from "@app/components/RelayName.svelte"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {getMembershipUrls, membershipsByPubkey} from "@app/state" import {getMembershipUrls, membershipsByPubkey} from "@app/core/state"
type Props = { type Props = {
pubkey: string pubkey: string
+1 -1
View File
@@ -2,7 +2,7 @@
import QRCode from "qrcode" import QRCode from "qrcode"
import {onMount} from "svelte" import {onMount} from "svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
const {code, ...props} = $props() const {code, ...props} = $props()
+2 -2
View File
@@ -21,8 +21,8 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Reaction from "@app/components/Reaction.svelte" import Reaction from "@app/components/Reaction.svelte"
import EventReportDetails from "@app/components/EventReportDetails.svelte" import EventReportDetails from "@app/components/EventReportDetails.svelte"
import {REACTION_KINDS} from "@app/state" import {REACTION_KINDS} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
interface Props { interface Props {
event: TrustedEvent event: TrustedEvent
+3 -3
View File
@@ -10,9 +10,9 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {hasNip29, loadChannel} from "@app/state" import {hasNip29, loadChannel} from "@app/core/state"
import {makeSpacePath} from "@app/routes" import {makeSpacePath} from "@app/util/routes"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
const {url} = $props() const {url} = $props()
+3 -3
View File
@@ -10,9 +10,9 @@
import InfoNostr from "@app/components/InfoNostr.svelte" import InfoNostr from "@app/components/InfoNostr.svelte"
import SignUpProfile from "@app/components/SignUpProfile.svelte" import SignUpProfile from "@app/components/SignUpProfile.svelte"
import SignUpSuccess from "@app/components/SignUpSuccess.svelte" import SignUpSuccess from "@app/components/SignUpSuccess.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {BURROW_URL, PLATFORM_NAME} from "@app/state" import {BURROW_URL, PLATFORM_NAME} from "@app/core/state"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
const login = () => pushModal(LogIn) const login = () => pushModal(LogIn)
+1 -1
View File
@@ -7,7 +7,7 @@
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {PROTECTED} from "@app/state" import {PROTECTED} from "@app/core/state"
type Props = { type Props = {
secret: string secret: string
+2 -2
View File
@@ -11,8 +11,8 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SignUpComplete from "@app/components/SignUpComplete.svelte" import SignUpComplete from "@app/components/SignUpComplete.svelte"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
type Props = { type Props = {
profile: Profile profile: Profile
+1 -1
View File
@@ -6,7 +6,7 @@
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import ProfileEditForm from "@app/components/ProfileEditForm.svelte" import ProfileEditForm from "@app/components/ProfileEditForm.svelte"
import SignUpKey from "@app/components/SignUpKey.svelte" import SignUpKey from "@app/components/SignUpKey.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const initialValues = { const initialValues = {
profile: makeProfile(), profile: makeProfile(),
+1 -1
View File
@@ -1,7 +1,7 @@
<script lang="ts"> <script lang="ts">
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import LogInPassword from "@app/components/LogInPassword.svelte" import LogInPassword from "@app/components/LogInPassword.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {email} = $props() const {email} = $props()
+1 -1
View File
@@ -4,7 +4,7 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte" import Button from "@lib/components/Button.svelte"
import LogOut from "@app/components/LogOut.svelte" import LogOut from "@app/components/LogOut.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {Pending, Success, Failure} = SignerLogEntryStatus const {Pending, Success, Failure} = SignerLogEntryStatus
const pending = $derived($signerLog.filter(spec({status: Pending})).length) const pending = $derived($signerLog.filter(spec({status: Pending})).length)
+3 -3
View File
@@ -9,9 +9,9 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SpaceJoinConfirm, {confirmSpaceJoin} from "@app/components/SpaceJoinConfirm.svelte" import SpaceJoinConfirm, {confirmSpaceJoin} from "@app/components/SpaceJoinConfirm.svelte"
import {pushToast} from "@app/toast" import {pushToast} from "@app/util/toast"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
import {attemptRelayAccess} from "@app/commands" import {attemptRelayAccess} from "@app/core/commands"
type Props = { type Props = {
url: string url: string
+1 -1
View File
@@ -6,7 +6,7 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import SpaceCreateExternal from "@app/components/SpaceCreateExternal.svelte" import SpaceCreateExternal from "@app/components/SpaceCreateExternal.svelte"
import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte" import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const startCreate = () => pushModal(SpaceCreateExternal) const startCreate = () => pushModal(SpaceCreateExternal)
+1 -1
View File
@@ -8,7 +8,7 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SpaceAccessRequest from "@app/components/SpaceAccessRequest.svelte" import SpaceAccessRequest from "@app/components/SpaceAccessRequest.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {url, error} = $props() const {url, error} = $props()
+2 -2
View File
@@ -10,8 +10,8 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SpaceVisitConfirm, {confirmSpaceVisit} from "@app/components/SpaceVisitConfirm.svelte" import SpaceVisitConfirm, {confirmSpaceVisit} from "@app/components/SpaceVisitConfirm.svelte"
import {attemptRelayAccess} from "@app/commands" import {attemptRelayAccess} from "@app/core/commands"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const {url} = $props() const {url} = $props()
+1 -1
View File
@@ -8,7 +8,7 @@
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import InfoRelay from "@app/components/InfoRelay.svelte" import InfoRelay from "@app/components/InfoRelay.svelte"
import SpaceCreateFinish from "@app/components/SpaceCreateFinish.svelte" import SpaceCreateFinish from "@app/components/SpaceCreateFinish.svelte"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const back = () => history.back() const back = () => history.back()
@@ -6,8 +6,8 @@
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte" import SpaceInviteAccept from "@app/components/SpaceInviteAccept.svelte"
import {PLATFORM_NAME} from "@app/state" import {PLATFORM_NAME} from "@app/core/state"
import {pushModal} from "@app/modal" import {pushModal} from "@app/util/modal"
const back = () => history.back() const back = () => history.back()
+1 -1
View File
@@ -7,7 +7,7 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {removeSpaceMembership} from "@app/commands" import {removeSpaceMembership} from "@app/core/commands"
const {url} = $props() const {url} = $props()
+1 -1
View File
@@ -10,7 +10,7 @@
import Icon from "@lib/components/Icon.svelte" import Icon from "@lib/components/Icon.svelte"
import ModalHeader from "@lib/components/ModalHeader.svelte" import ModalHeader from "@lib/components/ModalHeader.svelte"
import ModalFooter from "@lib/components/ModalFooter.svelte" import ModalFooter from "@lib/components/ModalFooter.svelte"
import {clip} from "@app/toast" import {clip} from "@app/util/toast"
const {url} = $props() const {url} = $props()

Some files were not shown because too many files have changed in this diff Show More