- Added public discovery section for active splits on the landing page - Refactored split detail page for guest support and login redirects - Extracted SplitCard component for reuse - Consolidated RLS policies for bottles and tastings to resolve permission errors - Added unified SQL consolidation script for RLS and naming fixes - Enhanced service logging for better database error diagnostics
259 lines
6.5 KiB
TypeScript
259 lines
6.5 KiB
TypeScript
export type TranslationKeys = {
|
|
splits: {
|
|
joinTitle: string;
|
|
amount: string;
|
|
shipping: string;
|
|
whisky: string;
|
|
glass: string;
|
|
total: string;
|
|
requestSent: string;
|
|
requestSentDesc: string;
|
|
loginToParticipate: string;
|
|
loginToParticipateDesc: string;
|
|
publicExplore: string;
|
|
waitlist: string;
|
|
sendRequest: string;
|
|
youAreParticipating: string;
|
|
byHost: string;
|
|
shareLink: string;
|
|
backToStart: string;
|
|
noSplitsFound: string;
|
|
falscheTeilung: string;
|
|
clFlasche: string;
|
|
jahre: string;
|
|
};
|
|
common: {
|
|
save: string;
|
|
cancel: string;
|
|
edit: string;
|
|
delete: string;
|
|
loading: string;
|
|
error: string;
|
|
success: string;
|
|
search: string;
|
|
back: string;
|
|
confirm: string;
|
|
check: string;
|
|
link: string;
|
|
none: string;
|
|
all: string;
|
|
};
|
|
home: {
|
|
title: string;
|
|
logout: string;
|
|
stats: {
|
|
title: string;
|
|
totalValue: string;
|
|
activeBottles: string;
|
|
avgRating: string;
|
|
topDistillery: string;
|
|
};
|
|
dramOfDay: {
|
|
button: string;
|
|
rollAgain: string;
|
|
suggestion: string;
|
|
noOpenBottles: string;
|
|
title: string;
|
|
viewBottle: string;
|
|
};
|
|
searchPlaceholder: string;
|
|
noBottles: string;
|
|
collection: string;
|
|
reTry: string;
|
|
all: string;
|
|
tagline: string;
|
|
bottleCount: string;
|
|
imprint: string;
|
|
privacy: string;
|
|
settings: string;
|
|
};
|
|
grid: {
|
|
searchPlaceholder: string;
|
|
noResults: string;
|
|
sortBy: {
|
|
createdAt: string;
|
|
lastTasted: string;
|
|
name: string;
|
|
};
|
|
filter: {
|
|
category: string;
|
|
distillery: string;
|
|
status: string;
|
|
};
|
|
addSession: string;
|
|
addedOn: string;
|
|
reviewRequired: string;
|
|
unknownBottle: string;
|
|
filters: string;
|
|
resetAll: string;
|
|
close: string;
|
|
};
|
|
bottle: {
|
|
details: string;
|
|
distillery: string;
|
|
category: string;
|
|
abv: string;
|
|
age: string;
|
|
years: string;
|
|
lastTasted: string;
|
|
neverTasted: string;
|
|
purchasePrice: string;
|
|
distilled: string;
|
|
bottled: string;
|
|
batch: string;
|
|
status: {
|
|
sealed: string;
|
|
open: string;
|
|
sampled: string;
|
|
empty: string;
|
|
};
|
|
whiskybaseId: string;
|
|
tastingNotes: string;
|
|
tastingNotesDesc: string;
|
|
noNotes: string;
|
|
editDetails: string;
|
|
editTitle: string;
|
|
autoSearch: string;
|
|
applyId: string;
|
|
saveChanges: string;
|
|
noMatchFound: string;
|
|
priceLabel: string;
|
|
nameLabel: string;
|
|
distilleryLabel: string;
|
|
categoryLabel: string;
|
|
abvLabel: string;
|
|
ageLabel: string;
|
|
distilledLabel: string;
|
|
bottledLabel: string;
|
|
batchLabel: string;
|
|
bottleStatus: string;
|
|
};
|
|
camera: {
|
|
scanBottle: string;
|
|
uploadImage: string;
|
|
analyzing: string;
|
|
analysisError: string;
|
|
matchFound: string;
|
|
notAWhisky: string;
|
|
lowConfidence: string;
|
|
saveToVault: string;
|
|
tastingNow: string;
|
|
quickTasting: string;
|
|
backToList: string;
|
|
whiskybaseSearch: string;
|
|
searchingWb: string;
|
|
wbMatchFound: string;
|
|
magicShot: string;
|
|
saveSuccess: string;
|
|
later: string;
|
|
openingCamera: string;
|
|
saving: string;
|
|
nextBottle: string;
|
|
newPhoto: string;
|
|
inVault: string;
|
|
offlineNotice: string;
|
|
alreadyInVault: string;
|
|
alreadyInVaultDesc: string;
|
|
saveAnyway: string;
|
|
analysisSuccess: string;
|
|
results: string;
|
|
toVault: string;
|
|
authRequired: string;
|
|
processingError: string;
|
|
uploadGallery: string;
|
|
};
|
|
tasting: {
|
|
addNote: string;
|
|
isSample: string;
|
|
isBottle: string;
|
|
rating: string;
|
|
nose: string;
|
|
palate: string;
|
|
finish: string;
|
|
notesPlaceholder: string;
|
|
overall: string;
|
|
saveTasting: string;
|
|
participants: string;
|
|
addParticipant: string;
|
|
};
|
|
buddy: {
|
|
title: string;
|
|
addBuddy: string;
|
|
placeholder: string;
|
|
noBuddies: string;
|
|
};
|
|
session: {
|
|
title: string;
|
|
activeSession: string;
|
|
allSessions: string;
|
|
newSession: string;
|
|
sessionName: string;
|
|
noSessions: string;
|
|
expiryWarning: string;
|
|
};
|
|
nav: {
|
|
home: string;
|
|
shelf: string;
|
|
activity: string;
|
|
search: string;
|
|
profile: string;
|
|
};
|
|
hub: {
|
|
title: string;
|
|
subtitle: string;
|
|
tabs: {
|
|
tastings: string;
|
|
splits: string;
|
|
};
|
|
sections: {
|
|
startSession: string;
|
|
startSplit: string;
|
|
activeNow: string;
|
|
yourSessions: string;
|
|
yourSplits: string;
|
|
participating: string;
|
|
};
|
|
placeholders: {
|
|
sessionName: string;
|
|
noSessions: string;
|
|
noSplits: string;
|
|
openSplitCreator: string;
|
|
};
|
|
};
|
|
tutorial: {
|
|
skip: string;
|
|
next: string;
|
|
finish: string;
|
|
steps: {
|
|
welcome: { title: string; desc: string };
|
|
scan: { title: string; desc: string };
|
|
taste: { title: string; desc: string };
|
|
activity: { title: string; desc: string };
|
|
ready: { title: string; desc: string };
|
|
};
|
|
};
|
|
settings: {
|
|
title: string;
|
|
language: string;
|
|
cookieSettings: string;
|
|
cookieDesc: string;
|
|
cookieNecessary: string;
|
|
cookieFunctional: string;
|
|
privacy: string;
|
|
privacyDesc: string;
|
|
privacyLink: string;
|
|
memberSince: string;
|
|
password: {
|
|
title: string;
|
|
newPassword: string;
|
|
confirmPassword: string;
|
|
match: string;
|
|
mismatch: string;
|
|
tooShort: string;
|
|
success: string;
|
|
change: string;
|
|
};
|
|
};
|
|
aroma: Record<string, string>;
|
|
};
|