forked from jmug/cactoide
Handmade content changes
This commit is contained in:
@@ -2,6 +2,7 @@ services:
|
|||||||
# Database
|
# Database
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:15-alpine
|
image: postgres:15-alpine
|
||||||
|
restart: unless-stopped
|
||||||
container_name: cactoide-db
|
container_name: cactoide-db
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_DB: ${POSTGRES_DB:-cactoide_database}
|
POSTGRES_DB: ${POSTGRES_DB:-cactoide_database}
|
||||||
@@ -28,7 +29,8 @@ services:
|
|||||||
|
|
||||||
# Application
|
# Application
|
||||||
app:
|
app:
|
||||||
image: ghcr.io/polaroi8d/cactoide/cactoide:${APP_VERSION:-latest}
|
image: cactoide:handmade
|
||||||
|
restart: unless-stopped
|
||||||
build: .
|
build: .
|
||||||
container_name: cactoide-app
|
container_name: cactoide-app
|
||||||
ports:
|
ports:
|
||||||
@@ -46,7 +48,6 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
networks:
|
networks:
|
||||||
- cactoide-network
|
- cactoide-network
|
||||||
restart: unless-stopped
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
|||||||
@@ -6,12 +6,6 @@
|
|||||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||||
%sveltekit.head%
|
%sveltekit.head%
|
||||||
|
|
||||||
<!-- Remove if you don't want to use analytics -->
|
|
||||||
<script
|
|
||||||
defer
|
|
||||||
src="https://analytics.dalev.hu/script.js"
|
|
||||||
data-website-id="7425d098-e340-4464-bd03-c2e47b004cd9"
|
|
||||||
></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body data-sveltekit-preload-data="hover">
|
<body data-sveltekit-preload-data="hover">
|
||||||
<div style="display: contents">%sveltekit.body%</div>
|
<div style="display: contents">%sveltekit.body%</div>
|
||||||
|
|||||||
@@ -103,16 +103,16 @@
|
|||||||
"instance": "Instance"
|
"instance": "Instance"
|
||||||
},
|
},
|
||||||
"home": {
|
"home": {
|
||||||
"title": "Cactoide - The RSVP site",
|
"title": "RSVP | Handmade Cities",
|
||||||
"description": "Create and manage event RSVPs. No registration required, instant sharing.",
|
"description": "Create and manage event RSVPs. No registration required, instant sharing.",
|
||||||
"mainTitle": "Cactoide(ea)",
|
"mainTitle": "Cactoide",
|
||||||
"subtitle": "The Ultimate RSVP Platform",
|
"subtitle": "Handmade's Preferred RSVP System",
|
||||||
"tagline": "A federated mobile-first event RSVP platform that lets you create events, share unique URLs, and collect RSVPs without any registration required. With built-in federation, discover and share events across a decentralized network of instances.",
|
"tagline": "Create, share, and manage events with zero friction.",
|
||||||
"openSourceTitle": "Open Source & Self-Hostable",
|
"openSourceTitle": "Open Source & Self-Hostable",
|
||||||
"openSourceDescription": "Cactoide is open source and easily self-hostable. View the source code, contribute, or host your own instance.",
|
"openSourceDescription": "Cactoide is open source and easily self-hostable. View the source code, contribute, or host your own instance.",
|
||||||
"viewOnGitHub": "View on GitHub",
|
"viewOnGitHub": "View on GitHub",
|
||||||
"whyCactoideTitle": "Why Cactoide(ae)?🌵",
|
"whyCactoideTitle": "Why Cactoide?",
|
||||||
"whyCactoideDescription": "Like the cactus, great events bloom under any condition when managed with care. Cactoide(ae) helps you streamline RSVPs, simplify coordination, and keep every detail efficient—so your gatherings are resilient, vibrant, and unforgettable.",
|
"whyCactoideDescription": "Cactoide is lightweight and open source. Meetup Hosts should ALWAYS create private events. We currently don't prevent strangers from spamming public ones:",
|
||||||
"createEventNow": "Create Event Now",
|
"createEventNow": "Create Event Now",
|
||||||
"discoverPublicEventsTitle": "Discover Public Events",
|
"discoverPublicEventsTitle": "Discover Public Events",
|
||||||
"discoverPublicEventsDescription": "See what others are planning and get inspired",
|
"discoverPublicEventsDescription": "See what others are planning and get inspired",
|
||||||
@@ -146,7 +146,7 @@
|
|||||||
"ctaButton": "Create"
|
"ctaButton": "Create"
|
||||||
},
|
},
|
||||||
"create": {
|
"create": {
|
||||||
"title": "Create Event - Cactoide",
|
"title": "Create Event - Handmade Cities",
|
||||||
"formTitle": "Create New Event",
|
"formTitle": "Create New Event",
|
||||||
"eventNameLabel": "Name",
|
"eventNameLabel": "Name",
|
||||||
"eventNamePlaceholder": "Enter event name",
|
"eventNamePlaceholder": "Enter event name",
|
||||||
@@ -179,10 +179,10 @@
|
|||||||
"createEventButton": "Create Event"
|
"createEventButton": "Create Event"
|
||||||
},
|
},
|
||||||
"event": {
|
"event": {
|
||||||
"title": "{eventName} - Cactoide",
|
"title": "{eventName} - Handmade Cities",
|
||||||
"eventTitle": "Event - Cactoide",
|
"eventTitle": "Event - Handmade Cities",
|
||||||
"editTitle": "Edit Event - {eventName} - Cactoide",
|
"editTitle": "Edit Event - {eventName} - Handmade Cities",
|
||||||
"myEventsTitle": "My Events - Cactoide",
|
"myEventsTitle": "My Events - Handmade Cities",
|
||||||
"eventNotFoundTitle": "Event Not Found",
|
"eventNotFoundTitle": "Event Not Found",
|
||||||
"eventNotFoundDescription": "The event you're looking for doesn't exist or has been removed.",
|
"eventNotFoundDescription": "The event you're looking for doesn't exist or has been removed.",
|
||||||
"joinThisEvent": "Join This Event",
|
"joinThisEvent": "Join This Event",
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
"inviteLinkExpiresAt": "This link expires when the event starts: {time}"
|
"inviteLinkExpiresAt": "This link expires when the event starts: {time}"
|
||||||
},
|
},
|
||||||
"discover": {
|
"discover": {
|
||||||
"title": "Discover Events - Cactoide",
|
"title": "Discover Events - Handmade Cities",
|
||||||
"noPublicEventsTitle": "No Public Events Yet",
|
"noPublicEventsTitle": "No Public Events Yet",
|
||||||
"noPublicEventsDescription": "There are no public events available at the moment. Be the first to create one!",
|
"noPublicEventsDescription": "There are no public events available at the moment. Be the first to create one!",
|
||||||
"createButton": "Create",
|
"createButton": "Create",
|
||||||
@@ -283,13 +283,13 @@
|
|||||||
"downloadICalDescription": "Download .ics file for any calendar app"
|
"downloadICalDescription": "Download .ics file for any calendar app"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"title": "Error - Cactoide",
|
"title": "Error - Handmade Cities",
|
||||||
"errorTitle": "Error",
|
"errorTitle": "Error",
|
||||||
"anUnexpectedErrorOccurred": "An unexpected error occurred.",
|
"anUnexpectedErrorOccurred": "An unexpected error occurred.",
|
||||||
"homeButton": "Home"
|
"homeButton": "Home"
|
||||||
},
|
},
|
||||||
"layout": {
|
"layout": {
|
||||||
"defaultTitle": "Cactoide -",
|
"defaultTitle": "Handmade Cities -",
|
||||||
"defaultDescription": "Create and manage event RSVPs",
|
"defaultDescription": "Create and manage event RSVPs",
|
||||||
"userIdCookieText": "Your UserID stored as a cookie:",
|
"userIdCookieText": "Your UserID stored as a cookie:",
|
||||||
"firstTimeVisiting": "First time visiting. Generating new UserID...",
|
"firstTimeVisiting": "First time visiting. Generating new UserID...",
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
import CalendarModal from '$lib/components/CalendarModal.svelte';
|
import CalendarModal from '$lib/components/CalendarModal.svelte';
|
||||||
import type { CalendarEvent } from '$lib/calendarHelpers.js';
|
import type { CalendarEvent } from '$lib/calendarHelpers.js';
|
||||||
import { t } from '$lib/i18n/i18n.js';
|
import { t } from '$lib/i18n/i18n.js';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
export let data: { event: Event; rsvps: RSVP[]; userId: string };
|
export let data: { event: Event; rsvps: RSVP[]; userId: string };
|
||||||
type FormDataLocal = { success?: boolean; error?: string; type?: 'add' | 'remove' | 'copy' };
|
type FormDataLocal = { success?: boolean; error?: string; type?: 'add' | 'remove' | 'copy' };
|
||||||
@@ -27,6 +28,17 @@
|
|||||||
let typeToShow: 'add' | 'remove' | 'copy' | undefined;
|
let typeToShow: 'add' | 'remove' | 'copy' | undefined;
|
||||||
let successHideTimer: number | null = null;
|
let successHideTimer: number | null = null;
|
||||||
|
|
||||||
|
// Compute eventId early so reactive blocks can use it.
|
||||||
|
const eventId = $page.params.id || '';
|
||||||
|
|
||||||
|
// client-only origin (empty during SSR).
|
||||||
|
let origin = '';
|
||||||
|
|
||||||
|
// Safe: Only runs in browser.
|
||||||
|
onMount(() => {
|
||||||
|
origin = window.location.origin;
|
||||||
|
});
|
||||||
|
|
||||||
// Use server-side data
|
// Use server-side data
|
||||||
$: event = data.event;
|
$: event = data.event;
|
||||||
$: rsvps = data.rsvps;
|
$: rsvps = data.rsvps;
|
||||||
@@ -40,10 +52,26 @@
|
|||||||
date: event.date,
|
date: event.date,
|
||||||
time: event.time,
|
time: event.time,
|
||||||
location: event.location,
|
location: event.location,
|
||||||
url: `${$page.url.origin}/event/${eventId}`
|
// Fallback to relative path on server render.
|
||||||
|
url: origin ? `${origin}/event/${eventId}` : `/event/${eventId}`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const copyEventLink = () => {
|
||||||
|
if (browser && isEventCreator) {
|
||||||
|
const url = origin ? `${origin}/event/${eventId}` : `${location.origin}/event/${eventId}`;
|
||||||
|
navigator.clipboard.writeText(url).then(() => {
|
||||||
|
toastType = 'copy';
|
||||||
|
success = t('event.eventLinkCopied');
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
success = '';
|
||||||
|
toastType = null;
|
||||||
|
}, 3000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Handle form errors from server
|
// Handle form errors from server
|
||||||
$: if (form?.error) {
|
$: if (form?.error) {
|
||||||
error = String(form.error);
|
error = String(form.error);
|
||||||
@@ -79,22 +107,7 @@
|
|||||||
// Derive toast type from local or server form
|
// Derive toast type from local or server form
|
||||||
$: typeToShow = toastType ?? form?.type;
|
$: typeToShow = toastType ?? form?.type;
|
||||||
|
|
||||||
const eventId = $page.params.id || '';
|
|
||||||
|
|
||||||
const copyEventLink = () => {
|
|
||||||
if (browser && isEventCreator) {
|
|
||||||
const url = `${$page.url.origin}/event/${eventId}`;
|
|
||||||
navigator.clipboard.writeText(url).then(() => {
|
|
||||||
toastType = 'copy';
|
|
||||||
success = t('event.eventLinkCopied');
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
success = '';
|
|
||||||
toastType = null;
|
|
||||||
}, 3000);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const clearMessages = () => {
|
const clearMessages = () => {
|
||||||
error = '';
|
error = '';
|
||||||
@@ -476,7 +489,7 @@
|
|||||||
bind:isOpen={showCalendarModal}
|
bind:isOpen={showCalendarModal}
|
||||||
event={calendarEvent}
|
event={calendarEvent}
|
||||||
{eventId}
|
{eventId}
|
||||||
baseUrl={$page.url.origin}
|
baseUrl={origin}
|
||||||
on:close={closeCalendarModal}
|
on:close={closeCalendarModal}
|
||||||
/>
|
/>
|
||||||
{/if}
|
{/if}
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 162 KiB |
Reference in New Issue
Block a user