Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 31 additions & 10 deletions apps/mobile/app/(main)/chat/[id].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,19 @@ import {
Icon,
FullScreenSearchModal,
IconButton,
View,
} from '@open-webui-react-native/mobile/shared/ui/ui-kit';
import {
ChatScreenParams,
navigationConfig,
useInitialNavigation,
} from '@open-webui-react-native/mobile/shared/utils/navigation';
import { chatApi, getSelectableModels, modelsApi } from '@open-webui-react-native/shared/data-access/api';
import {
chatApi,
getSelectableModels,
isTemporaryChatId,
modelsApi,
} from '@open-webui-react-native/shared/data-access/api';
import { appState$ } from '@open-webui-react-native/shared/data-access/app-state';
import { useNavigateOnce } from '@open-webui-react-native/shared/utils/navigation';
import { useTranslation } from '@ronas-it/react-native-common-modules/i18n';
Expand All @@ -39,9 +45,11 @@ export default function ChatScreen(): ReactElement {
const navigateToClonedChat = (id: string): void => navigateOnce(navigationConfig.main.chat.view({ id }));

const isOfflineMode = useSelector(appState$.isOfflineMode);
const isTemporaryChat = isTemporaryChatId(id);

const { data: models, isLoading: isModelsLoading } = modelsApi.useGetModels();
const { data: chat, isLoading: isChatLoading } = chatApi.useGet(id);
// NOTE: Temporary chats are never persisted, so there's nothing to fetch — read the client-seeded cache only.
const { data: chat, isLoading: isChatLoading } = chatApi.useGet(id, { enabled: !isTemporaryChat });
const { modelId, modelName, onSelectModel } = useSetSelectedModel(id);

const selectableModels = useMemo(() => getSelectableModels(models), [models]);
Expand Down Expand Up @@ -75,22 +83,35 @@ export default function ChatScreen(): ReactElement {
isLoading && !modelId ? (
translate('TEXT_LOADING')
) : (
<FullScreenSearchModal
data={selectableModels}
renderTrigger={renderTrigger}
selectedItemId={modelId}
onSelectItem={onSelectModel}
searchPlaceholder={translate('TEXT_SELECT_A_MODEL')}
/>
<View className='items-center'>
{isTemporaryChat && (
<View className='flex-row items-center gap-4'>
<Icon name='eyeClosed' className='size-12 shrink-0 color-text-secondary' />
<AppText className='text-xs-sm sm:text-xs text-text-secondary'>
{translate('TEXT_TEMPORARY_CHAT')}
</AppText>
</View>
)}
<FullScreenSearchModal
data={selectableModels}
renderTrigger={renderTrigger}
selectedItemId={modelId}
onSelectItem={onSelectModel}
searchPlaceholder={translate('TEXT_SELECT_A_MODEL')}
/>
</View>
)
}
onGoBack={handleGoBackPress}
accessoryRight={
<IconButton
className='p-0'
iconName='moreDots'
// NOTE: Temporary chats are never persisted — none of the chat actions (pin, rename,
// clone, archive, delete, share, move-to-folder) are meaningful for one.
disabled={!chat || isTemporaryChat}
onPress={() => {
if (!chat) return;
if (!chat || isTemporaryChat) return;
chatActionsSheetRef.current?.present(chat);
}}
/>
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Archivierte Chats",
"TEXT_EXPORT_ALL_CHATS": "Alle Chats exportieren",
"TEXT_ARCHIVE_ALL": "Alle archivieren",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Alle Chats archivieren",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "Möchten Sie wirklich alle Chats archivieren? Diese Aktion kann nicht rückgängig gemacht werden.",
"TEXT_DELETE_ALL": "Alle löschen",
"TEXT_DELETE_ALL_CHATS_TITLE": "Alle Chats löschen",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "Möchten Sie wirklich alle Chats löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Websuche immer aktiv",
"TEXT_HAPTIC_FEEDBACK": "Haptisches Feedback",
"TEXT_ENABLE_MESSAGE_QUEUE": "Nachrichtenwarteschlange aktivieren",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Archived chats",
"TEXT_EXPORT_ALL_CHATS": "Export all chats",
"TEXT_ARCHIVE_ALL": "Archive all",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Archive All Chats",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "Are you sure you want to archive all chats? This action cannot be undone.",
"TEXT_DELETE_ALL": "Delete all",
"TEXT_DELETE_ALL_CHATS_TITLE": "Delete All Chats",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "Are you sure you want to delete all chats? This action cannot be undone.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Always-on web search",
"TEXT_HAPTIC_FEEDBACK": "Haptic feedback",
"TEXT_ENABLE_MESSAGE_QUEUE": "Enable message queue",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Chats archivados",
"TEXT_EXPORT_ALL_CHATS": "Exportar todos los chats",
"TEXT_ARCHIVE_ALL": "Archivar todo",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Archivar todos los chats",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "¿Estás seguro de que quieres archivar todos los chats? Esta acción no se puede deshacer.",
"TEXT_DELETE_ALL": "Eliminar todo",
"TEXT_DELETE_ALL_CHATS_TITLE": "Eliminar todos los chats",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "¿Estás seguro de que quieres eliminar todos los chats? Esta acción no se puede deshacer.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Búsqueda web siempre activa",
"TEXT_HAPTIC_FEEDBACK": "Respuesta háptica",
"TEXT_ENABLE_MESSAGE_QUEUE": "Activar cola de mensajes",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Discussions archivées",
"TEXT_EXPORT_ALL_CHATS": "Exporter toutes les discussions",
"TEXT_ARCHIVE_ALL": "Tout archiver",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Archiver toutes les discussions",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "Voulez-vous vraiment archiver toutes les discussions ? Cette action est irréversible.",
"TEXT_DELETE_ALL": "Tout supprimer",
"TEXT_DELETE_ALL_CHATS_TITLE": "Supprimer toutes les discussions",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "Voulez-vous vraiment supprimer toutes les discussions ? Cette action est irréversible.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Recherche web toujours active",
"TEXT_HAPTIC_FEEDBACK": "Retour haptique",
"TEXT_ENABLE_MESSAGE_QUEUE": "Activer la file d'attente des messages",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "アーカイブ済みチャット",
"TEXT_EXPORT_ALL_CHATS": "すべてのチャットをエクスポート",
"TEXT_ARCHIVE_ALL": "すべてアーカイブ",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "すべてのチャットをアーカイブ",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "すべてのチャットをアーカイブしてもよろしいですか?この操作は元に戻せません。",
"TEXT_DELETE_ALL": "すべて削除",
"TEXT_DELETE_ALL_CHATS_TITLE": "すべてのチャットを削除",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "すべてのチャットを削除してもよろしいですか?この操作は元に戻せません。",
"TEXT_ALWAYS_ON_WEB_SEARCH": "ウェブ検索を常に有効にする",
"TEXT_HAPTIC_FEEDBACK": "触覚フィードバック",
"TEXT_ENABLE_MESSAGE_QUEUE": "メッセージキューを有効にする",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Chats arquivados",
"TEXT_EXPORT_ALL_CHATS": "Exportar todos os chats",
"TEXT_ARCHIVE_ALL": "Arquivar tudo",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Arquivar todos os chats",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "Tem certeza de que deseja arquivar todos os chats? Esta ação não pode ser desfeita.",
"TEXT_DELETE_ALL": "Excluir tudo",
"TEXT_DELETE_ALL_CHATS_TITLE": "Excluir todos os chats",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "Tem certeza de que deseja excluir todos os chats? Esta ação não pode ser desfeita.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Busca na web sempre ativa",
"TEXT_HAPTIC_FEEDBACK": "Resposta tátil",
"TEXT_ENABLE_MESSAGE_QUEUE": "Ativar fila de mensagens",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "Архивные чаты",
"TEXT_EXPORT_ALL_CHATS": "Экспортировать все чаты",
"TEXT_ARCHIVE_ALL": "Архивировать все",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "Архивировать все чаты",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "Вы уверены, что хотите архивировать все чаты? Это действие нельзя отменить.",
"TEXT_DELETE_ALL": "Удалить все",
"TEXT_DELETE_ALL_CHATS_TITLE": "Удалить все чаты",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "Вы уверены, что хотите удалить все чаты? Это действие нельзя отменить.",
"TEXT_ALWAYS_ON_WEB_SEARCH": "Всегда искать в интернете",
"TEXT_HAPTIC_FEEDBACK": "Тактильная отдача",
"TEXT_ENABLE_MESSAGE_QUEUE": "Включить очередь сообщений",
Expand Down
4 changes: 4 additions & 0 deletions i18n/mobile/app/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
"TEXT_ARCHIVED_CHATS": "已归档聊天",
"TEXT_EXPORT_ALL_CHATS": "导出所有聊天",
"TEXT_ARCHIVE_ALL": "全部归档",
"TEXT_ARCHIVE_ALL_CHATS_TITLE": "归档所有聊天",
"TEXT_ARCHIVE_ALL_CHATS_MESSAGE": "确定要归档所有聊天吗?此操作无法撤销。",
"TEXT_DELETE_ALL": "全部删除",
"TEXT_DELETE_ALL_CHATS_TITLE": "删除所有聊天",
"TEXT_DELETE_ALL_CHATS_MESSAGE": "确定要删除所有聊天吗?此操作无法撤销。",
"TEXT_ALWAYS_ON_WEB_SEARCH": "始终开启联网搜索",
"TEXT_HAPTIC_FEEDBACK": "触感反馈",
"TEXT_ENABLE_MESSAGE_QUEUE": "启用消息队列",
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Wird geladen...",
"TEXT_SELECT_A_MODEL": "Modell auswählen"
"TEXT_SELECT_A_MODEL": "Modell auswählen",
"TEXT_TEMPORARY_CHAT": "Temporärer Chat"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Nachricht senden",
"TEXT_MODEL_NOT_SELECTED": "Kein Modell ausgewählt"
"TEXT_MODEL_NOT_SELECTED": "Kein Modell ausgewählt",
"TEXT_MESSAGE_QUEUED": "Nachricht in Warteschlange"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Loading...",
"TEXT_SELECT_A_MODEL": "Select a model"
"TEXT_SELECT_A_MODEL": "Select a model",
"TEXT_TEMPORARY_CHAT": "Temporary Chat"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Send a message",
"TEXT_MODEL_NOT_SELECTED": "Model not selected"
"TEXT_MODEL_NOT_SELECTED": "Model not selected",
"TEXT_MESSAGE_QUEUED": "Message queued"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Cargando...",
"TEXT_SELECT_A_MODEL": "Seleccionar un modelo"
"TEXT_SELECT_A_MODEL": "Seleccionar un modelo",
"TEXT_TEMPORARY_CHAT": "Chat temporal"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Enviar un mensaje",
"TEXT_MODEL_NOT_SELECTED": "Modelo no seleccionado"
"TEXT_MODEL_NOT_SELECTED": "Modelo no seleccionado",
"TEXT_MESSAGE_QUEUED": "Mensaje en cola"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Chargement...",
"TEXT_SELECT_A_MODEL": "Sélectionner un modèle"
"TEXT_SELECT_A_MODEL": "Sélectionner un modèle",
"TEXT_TEMPORARY_CHAT": "Discussion temporaire"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Envoyer un message",
"TEXT_MODEL_NOT_SELECTED": "Modèle non sélectionné"
"TEXT_MODEL_NOT_SELECTED": "Modèle non sélectionné",
"TEXT_MESSAGE_QUEUED": "Message mis en file d'attente"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "読み込み中...",
"TEXT_SELECT_A_MODEL": "モデルを選択"
"TEXT_SELECT_A_MODEL": "モデルを選択",
"TEXT_TEMPORARY_CHAT": "一時チャット"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "メッセージを送信",
"TEXT_MODEL_NOT_SELECTED": "モデルが選択されていません"
"TEXT_MODEL_NOT_SELECTED": "モデルが選択されていません",
"TEXT_MESSAGE_QUEUED": "メッセージをキューに追加しました"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Carregando...",
"TEXT_SELECT_A_MODEL": "Selecionar um modelo"
"TEXT_SELECT_A_MODEL": "Selecionar um modelo",
"TEXT_TEMPORARY_CHAT": "Chat temporário"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Enviar uma mensagem",
"TEXT_MODEL_NOT_SELECTED": "Modelo não selecionado"
"TEXT_MODEL_NOT_SELECTED": "Modelo não selecionado",
"TEXT_MESSAGE_QUEUED": "Mensagem na fila"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "Загрузка...",
"TEXT_SELECT_A_MODEL": "Выберите модель"
"TEXT_SELECT_A_MODEL": "Выберите модель",
"TEXT_TEMPORARY_CHAT": "Временный чат"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "Отправить сообщение",
"TEXT_MODEL_NOT_SELECTED": "Модель не выбрана"
"TEXT_MODEL_NOT_SELECTED": "Модель не выбрана",
"TEXT_MESSAGE_QUEUED": "Сообщение добавлено в очередь"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
6 changes: 4 additions & 2 deletions i18n/mobile/chat/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
"CHAT": {
"CHAT_SCREEN": {
"TEXT_LOADING": "加载中...",
"TEXT_SELECT_A_MODEL": "选择模型"
"TEXT_SELECT_A_MODEL": "选择模型",
"TEXT_TEMPORARY_CHAT": "临时聊天"
},
"CHAT": {
"TEXT_INPUT_PLACEHOLDER": "发送消息",
"TEXT_MODEL_NOT_SELECTED": "未选择模型"
"TEXT_MODEL_NOT_SELECTED": "未选择模型",
"TEXT_MESSAGE_QUEUED": "消息已加入队列"
},
"CHAT_MENU_LIST": {
"PINNED_CHAT_LIST": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import * as FileSystem from 'expo-file-system/legacy';
import { useState } from 'react';
import {
fileSystemService,
Expand All @@ -21,10 +20,7 @@ export const useExportArchivedChats = (): UseExportArchivedChatsResult => {
setIsExporting(true);

try {
const fileUri = `${FileSystem.documentDirectory}${downloadFileName}`;
const downloadedFile = await fileSystemService.downloadFile(exportAllChatsApiURL, fileUri);

await fileSystemService.shareAsync(downloadedFile.uri, downloadFileName, MimeType.JSON, UtiType.JSON);
await fileSystemService.downloadAndShareFile(exportAllChatsApiURL, downloadFileName, MimeType.JSON, UtiType.JSON);
} catch {
ToastService.showError();
} finally {
Expand Down
Loading
Loading