Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b14c3ab345 | |||
| 823058e335 | |||
| 60ec6924f3 | |||
| 18fc895fcb | |||
| 42295159a0 | |||
| db408ac30d |
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
# 1.0.4
|
||||
|
||||
* Fix thunk status click handler
|
||||
* Remove duplicate dependencies
|
||||
* Improve navigation on white-labeled instances
|
||||
* Add setting for font size
|
||||
|
||||
# 1.0.3
|
||||
|
||||
* Add light theme
|
||||
|
||||
@@ -7,8 +7,8 @@ android {
|
||||
applicationId "social.flotilla"
|
||||
minSdk rootProject.ext.minSdkVersion
|
||||
targetSdk rootProject.ext.targetSdkVersion
|
||||
versionCode 17
|
||||
versionName "1.0.3"
|
||||
versionCode 18
|
||||
versionName "1.0.4"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
aaptOptions {
|
||||
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
||||
|
||||
@@ -351,14 +351,14 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 10;
|
||||
CURRENT_PROJECT_VERSION = 11;
|
||||
DEVELOPMENT_TEAM = S26U9DYW3A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 1.0.3;
|
||||
MARKETING_VERSION = 1.0.4;
|
||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
@@ -376,14 +376,14 @@
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 10;
|
||||
CURRENT_PROJECT_VERSION = 11;
|
||||
DEVELOPMENT_TEAM = S26U9DYW3A;
|
||||
INFOPLIST_FILE = App/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "Flotilla Chat";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.social-networking";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
MARKETING_VERSION = 1.0.3;
|
||||
MARKETING_VERSION = 1.0.4;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = social.flotilla;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "flotilla",
|
||||
"version": "1.0.3",
|
||||
"version": "1.0.4",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
|
||||
@@ -12,7 +12,12 @@ if (!pkgName?.endsWith("package.json")) {
|
||||
const pkg = JSON.parse(fs.readFileSync(pkgName, "utf8"))
|
||||
|
||||
if (pkg.pnpm && pkg.pnpm.overrides) {
|
||||
delete pkg.pnpm.overrides
|
||||
// Use $package notation to make sure we only get one copy of each welshman dependency
|
||||
// TODO: move welshman to a single package to straighten all this out.
|
||||
for (const k of Object.keys(pkg.pnpm.overrides)) {
|
||||
pkg.pnpm.overrides[k] = '$' + k
|
||||
}
|
||||
|
||||
fs.writeFileSync(pkgName, JSON.stringify(pkg, null, 2) + "\n")
|
||||
console.log("Removed pnpm.overrides from package.json")
|
||||
} else {
|
||||
|
||||
@@ -388,6 +388,10 @@ progress[value]::-webkit-progress-value {
|
||||
@apply w-full md:left-[18.5rem] md:w-[calc(100%-18.5rem-var(--sair))];
|
||||
}
|
||||
|
||||
.cw-full {
|
||||
@apply w-full md:left-[4rem] md:w-[calc(100%-4rem-var(--sair))];
|
||||
}
|
||||
|
||||
.cb {
|
||||
@apply md:bottom-sai bottom-[calc(var(--saib)+3.5rem)];
|
||||
}
|
||||
|
||||
@@ -5,35 +5,30 @@
|
||||
import CardButton from "@lib/components/CardButton.svelte"
|
||||
import MenuSpacesItem from "@app/components/MenuSpacesItem.svelte"
|
||||
import SpaceAdd from "@app/components/SpaceAdd.svelte"
|
||||
import {userRoomsByUrl, PLATFORM_RELAY} from "@app/state"
|
||||
import {userRoomsByUrl} from "@app/state"
|
||||
import {pushModal} from "@app/modal"
|
||||
|
||||
const addSpace = () => pushModal(SpaceAdd)
|
||||
</script>
|
||||
|
||||
<div class="column menu gap-2">
|
||||
{#if PLATFORM_RELAY}
|
||||
<MenuSpacesItem url={PLATFORM_RELAY} />
|
||||
<Divider />
|
||||
{:else if $userRoomsByUrl.size > 0}
|
||||
{#if $userRoomsByUrl.size > 0}
|
||||
{#each $userRoomsByUrl.keys() as url (url)}
|
||||
<MenuSpacesItem {url} />
|
||||
{/each}
|
||||
<Divider />
|
||||
{/if}
|
||||
{#if !PLATFORM_RELAY}
|
||||
<Button onclick={addSpace}>
|
||||
<CardButton>
|
||||
{#snippet icon()}
|
||||
<div><Icon icon="login-2" size={7} /></div>
|
||||
{/snippet}
|
||||
{#snippet title()}
|
||||
<div>Add a space</div>
|
||||
{/snippet}
|
||||
{#snippet info()}
|
||||
<div>Join or create a new space</div>
|
||||
{/snippet}
|
||||
</CardButton>
|
||||
</Button>
|
||||
{/if}
|
||||
<Button onclick={addSpace}>
|
||||
<CardButton>
|
||||
{#snippet icon()}
|
||||
<div><Icon icon="login-2" size={7} /></div>
|
||||
{/snippet}
|
||||
{#snippet title()}
|
||||
<div>Add a space</div>
|
||||
{/snippet}
|
||||
{#snippet info()}
|
||||
<div>Join or create a new space</div>
|
||||
{/snippet}
|
||||
</CardButton>
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
import Link from "@lib/components/Link.svelte"
|
||||
import Profile from "@app/components/Profile.svelte"
|
||||
import ProfileInfo from "@app/components/ProfileInfo.svelte"
|
||||
import {makeChatPath} from "@app/routes"
|
||||
import {pubkeyLink} from "@app/state"
|
||||
|
||||
type Props = {
|
||||
pubkey: string
|
||||
@@ -37,9 +37,9 @@
|
||||
<div class="card2 bg-alt col-2 shadow-xl">
|
||||
<div class="flex justify-between">
|
||||
<Profile {pubkey} {url} />
|
||||
<Link class="btn btn-primary hidden sm:flex" href={makeChatPath([pubkey])}>
|
||||
<Icon icon="letter" />
|
||||
Start a Chat
|
||||
<Link external href={pubkeyLink(pubkey)} class="btn btn-primary hidden sm:flex">
|
||||
<Icon icon="user-circle" />
|
||||
See Complete Profile
|
||||
</Link>
|
||||
</div>
|
||||
<ProfileInfo {pubkey} {url} />
|
||||
@@ -48,8 +48,8 @@
|
||||
Last active {formatTimestampRelative($events[0].created_at)}
|
||||
</div>
|
||||
{/if}
|
||||
<Link class="btn btn-primary sm:hidden" href={makeChatPath([pubkey])}>
|
||||
<Icon icon="letter" />
|
||||
Start a Chat
|
||||
<Link external href={pubkeyLink(pubkey)} class="btn btn-primary sm:hidden">
|
||||
<Icon icon="user-circle" />
|
||||
See Complete Profile
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<script lang="ts">
|
||||
import type {Snippet} from "svelte"
|
||||
import {page} from "$app/stores"
|
||||
import {goto} from "$app/navigation"
|
||||
import {splitAt} from "@welshman/lib"
|
||||
@@ -16,8 +17,9 @@
|
||||
import {pushModal} from "@app/modal"
|
||||
import {makeSpacePath} from "@app/routes"
|
||||
import {notifications} from "@app/notifications"
|
||||
interface Props {
|
||||
children?: import("svelte").Snippet
|
||||
|
||||
type Props = {
|
||||
children?: Snippet
|
||||
}
|
||||
|
||||
const {children}: Props = $props()
|
||||
@@ -118,9 +120,14 @@
|
||||
notification={$notifications.has("/chat")}>
|
||||
<Avatar icon="letter" class="!h-10 !w-10" />
|
||||
</PrimaryNavItem>
|
||||
<PrimaryNavItem title="Spaces" onclick={showSpacesMenu} notification={anySpaceNotifications}>
|
||||
<Avatar icon="settings-minimalistic" class="!h-10 !w-10" />
|
||||
</PrimaryNavItem>
|
||||
{#if !PLATFORM_RELAY}
|
||||
<PrimaryNavItem
|
||||
title="Spaces"
|
||||
onclick={showSpacesMenu}
|
||||
notification={anySpaceNotifications}>
|
||||
<Avatar icon="settings-minimalistic" class="!h-10 !w-10" />
|
||||
</PrimaryNavItem>
|
||||
{/if}
|
||||
</div>
|
||||
<PrimaryNavItem title="Settings" onclick={showSettingsMenu}>
|
||||
<Avatar icon="settings" src={$userProfile?.picture} class="!h-10 !w-10" />
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
{#if url && $reports.length > 0}
|
||||
<button
|
||||
type="button"
|
||||
data-tip="{`This content has been reported as "${displayList(reportReasons)}".`}}"
|
||||
data-tip={`This content has been reported as "${displayList(reportReasons)}".`}
|
||||
class="btn btn-error btn-xs tooltip-right flex items-center gap-1 rounded-full"
|
||||
class:tooltip={!noTooltip && !isMobile}
|
||||
onclick={stopPropagation(preventDefault(onReportClick))}>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<script lang="ts">
|
||||
import {nth} from "@welshman/lib"
|
||||
import {stopPropagation} from "svelte/legacy"
|
||||
import {nth, noop} from "@welshman/lib"
|
||||
import {PublishStatus} from "@welshman/net"
|
||||
import {
|
||||
MergedThunk,
|
||||
@@ -60,9 +61,11 @@
|
||||
{@const url = failedUrls[0]}
|
||||
{@const status = $thunk.status[url]}
|
||||
{@const message = $thunk.details[url]}
|
||||
<div class="flex justify-end px-1 text-xs {restProps.class}">
|
||||
<button
|
||||
class="flex w-full justify-end px-1 text-xs {restProps.class}"
|
||||
onclick={stopPropagation(noop)}>
|
||||
<Tippy
|
||||
class="flex items-center {restProps.class}"
|
||||
class="flex items-center"
|
||||
component={ThunkStatusDetail}
|
||||
props={{url, message, status, retry}}
|
||||
params={{interactive: true}}>
|
||||
@@ -73,10 +76,10 @@
|
||||
</span>
|
||||
{/snippet}
|
||||
</Tippy>
|
||||
</div>
|
||||
</button>
|
||||
{:else if showPending}
|
||||
<div class="flex justify-end px-1 text-xs {restProps.class}">
|
||||
<span class="flex items-center gap-1 {restProps.class}">
|
||||
<div class="flex w-full justify-end px-1 text-xs {restProps.class}">
|
||||
<span class="flex items-center gap-1">
|
||||
<span class="loading loading-spinner mx-1 h-3 w-3 translate-y-px"></span>
|
||||
<span class="opacity-50">Sending...</span>
|
||||
<button
|
||||
@@ -84,7 +87,7 @@
|
||||
class="underline transition-all"
|
||||
class:link={canCancel}
|
||||
class:opacity-25={!canCancel}
|
||||
onclick={abort}>
|
||||
onclick={stopPropagation(abort)}>
|
||||
Cancel
|
||||
</button>
|
||||
</span>
|
||||
|
||||
@@ -296,6 +296,7 @@ export type Settings = {
|
||||
report_usage: boolean
|
||||
report_errors: boolean
|
||||
send_delay: number
|
||||
font_size: number
|
||||
}
|
||||
}
|
||||
|
||||
@@ -305,6 +306,7 @@ export const defaultSettings = {
|
||||
report_usage: true,
|
||||
report_errors: true,
|
||||
send_delay: 3000,
|
||||
font_size: 1,
|
||||
}
|
||||
|
||||
export const settings = deriveEventsMapped<Settings>(repository, {
|
||||
|
||||
@@ -14,9 +14,7 @@
|
||||
{@render props.input?.()}
|
||||
</div>
|
||||
</div>
|
||||
<div class="scroll-container overflow-auto">
|
||||
<div class="content-sizing">
|
||||
{@render props.content?.()}
|
||||
</div>
|
||||
<div class="scroll-container content-sizing overflow-auto pt-2">
|
||||
{@render props.content?.()}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -3,20 +3,28 @@
|
||||
|
||||
interface Props {
|
||||
label?: Snippet
|
||||
secondary?: Snippet
|
||||
input?: Snippet
|
||||
info?: Snippet
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
const {label, input, info, ...props}: Props = $props()
|
||||
const {label, secondary, input, info, ...props}: Props = $props()
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col gap-2 {props.class}">
|
||||
{#if label}
|
||||
<label class="flex items-center gap-2 font-bold">
|
||||
{@render label()}
|
||||
</label>
|
||||
{/if}
|
||||
<div class="flex items-center justify-between">
|
||||
{#if label}
|
||||
<label class="flex items-center gap-2 font-bold">
|
||||
{@render label()}
|
||||
</label>
|
||||
{/if}
|
||||
{#if secondary}
|
||||
<label class="flex items-center gap-2">
|
||||
{@render secondary()}
|
||||
</label>
|
||||
{/if}
|
||||
</div>
|
||||
{@render input?.()}
|
||||
{#if info}
|
||||
<p class="text-sm">
|
||||
|
||||
@@ -51,7 +51,13 @@
|
||||
import {setupTracking} from "@app/tracking"
|
||||
import {setupAnalytics} from "@app/analytics"
|
||||
import {nsecDecode} from "@lib/util"
|
||||
import {INDEXER_RELAYS, userMembership, ensureUnwrapped, canDecrypt} from "@app/state"
|
||||
import {
|
||||
INDEXER_RELAYS,
|
||||
userMembership,
|
||||
userSettingValues,
|
||||
ensureUnwrapped,
|
||||
canDecrypt,
|
||||
} from "@app/state"
|
||||
import {loadUserData, listenForNotifications} from "@app/requests"
|
||||
import {theme} from "@app/theme"
|
||||
import * as commands from "@app/commands"
|
||||
@@ -126,6 +132,12 @@
|
||||
document.body.setAttribute("data-theme", $theme)
|
||||
})
|
||||
|
||||
// Sync font size
|
||||
userSettingValues.subscribe($userSettingValues => {
|
||||
// @ts-ignore
|
||||
document.documentElement.style["font-size"] = `${$userSettingValues.font_size}rem`
|
||||
})
|
||||
|
||||
if (!db) {
|
||||
setupTracking()
|
||||
setupAnalytics()
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
{/snippet}
|
||||
</CardButton>
|
||||
</Link>
|
||||
<Link href="/people">
|
||||
<Link href="/chat">
|
||||
<CardButton>
|
||||
{#snippet icon()}
|
||||
<div><Icon icon="chat-round" size={7} /></div>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
})
|
||||
</script>
|
||||
|
||||
<Page>
|
||||
<Page class="cw-full">
|
||||
<ContentSearch>
|
||||
{#snippet input()}
|
||||
<label class="row-2 input input-bordered">
|
||||
|
||||
@@ -166,6 +166,24 @@
|
||||
<p>Choose a media server type and url for files you upload to {PLATFORM_NAME}.</p>
|
||||
{/snippet}
|
||||
</Field>
|
||||
<strong class="text-lg">Accessibility</strong>
|
||||
<Field>
|
||||
{#snippet label()}
|
||||
<p>Font size</p>
|
||||
{/snippet}
|
||||
{#snippet secondary()}
|
||||
<p>{Math.round(settings.font_size * 100)}%</p>
|
||||
{/snippet}
|
||||
{#snippet input()}
|
||||
<input
|
||||
class="range range-primary"
|
||||
type="range"
|
||||
min="0.8"
|
||||
max="1.3"
|
||||
step="0.05"
|
||||
bind:value={settings.font_size} />
|
||||
{/snippet}
|
||||
</Field>
|
||||
<div class="mt-4 flex flex-row items-center justify-between gap-4">
|
||||
<Button class="btn btn-neutral" onclick={reset}>Discard Changes</Button>
|
||||
<Button type="submit" class="btn btn-primary">Save Changes</Button>
|
||||
|
||||
Reference in New Issue
Block a user