mirror of
https://github.com/open-webui/open-webui
synced 2025-05-17 20:05:08 +00:00
chore: format
This commit is contained in:
parent
7c68a424f8
commit
9f27d7710b
@ -1186,9 +1186,7 @@ async def get_app_config(request: Request):
|
|||||||
"client_id": GOOGLE_DRIVE_CLIENT_ID.value,
|
"client_id": GOOGLE_DRIVE_CLIENT_ID.value,
|
||||||
"api_key": GOOGLE_DRIVE_API_KEY.value,
|
"api_key": GOOGLE_DRIVE_API_KEY.value,
|
||||||
},
|
},
|
||||||
"onedrive": {
|
"onedrive": {"client_id": ONEDRIVE_CLIENT_ID.value},
|
||||||
"client_id": ONEDRIVE_CLIENT_ID.value
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if user is not None
|
if user is not None
|
||||||
else {}
|
else {}
|
||||||
|
@ -667,7 +667,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<hr class=" border-gray-100 dark:border-gray-850" />
|
<hr class=" border-gray-100 dark:border-gray-850" />
|
||||||
|
|
||||||
<div class=" ">
|
<div class=" ">
|
||||||
|
@ -127,8 +127,7 @@
|
|||||||
<div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
|
<div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
|
||||||
<Suggestions
|
<Suggestions
|
||||||
className="grid grid-cols-2"
|
className="grid grid-cols-2"
|
||||||
suggestionPrompts={
|
suggestionPrompts={atSelectedModel?.info?.meta?.suggestion_prompts ??
|
||||||
atSelectedModel?.info?.meta?.suggestion_prompts ??
|
|
||||||
models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
||||||
$config?.default_prompt_suggestions ??
|
$config?.default_prompt_suggestions ??
|
||||||
[]}
|
[]}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
import { config, user, tools as _tools, mobile } from '$lib/stores';
|
import { config, user, tools as _tools, mobile } from '$lib/stores';
|
||||||
import { createPicker } from '$lib/utils/google-drive-picker';
|
import { createPicker } from '$lib/utils/google-drive-picker';
|
||||||
|
|
||||||
import { getTools } from '$lib/apis/tools';
|
import { getTools } from '$lib/apis/tools';
|
||||||
|
|
||||||
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
||||||
@ -236,31 +236,82 @@
|
|||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="w-5 h-5" fill="none">
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" class="w-5 h-5" fill="none">
|
||||||
<mask id="mask0_87_7796" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="6" width="32" height="20">
|
<mask
|
||||||
<path d="M7.82979 26C3.50549 26 0 22.5675 0 18.3333C0 14.1921 3.35322 10.8179 7.54613 10.6716C9.27535 7.87166 12.4144 6 16 6C20.6308 6 24.5169 9.12183 25.5829 13.3335C29.1316 13.3603 32 16.1855 32 19.6667C32 23.0527 29 26 25.8723 25.9914L7.82979 26Z" fill="#C4C4C4"/>
|
id="mask0_87_7796"
|
||||||
|
style="mask-type:alpha"
|
||||||
|
maskUnits="userSpaceOnUse"
|
||||||
|
x="0"
|
||||||
|
y="6"
|
||||||
|
width="32"
|
||||||
|
height="20"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M7.82979 26C3.50549 26 0 22.5675 0 18.3333C0 14.1921 3.35322 10.8179 7.54613 10.6716C9.27535 7.87166 12.4144 6 16 6C20.6308 6 24.5169 9.12183 25.5829 13.3335C29.1316 13.3603 32 16.1855 32 19.6667C32 23.0527 29 26 25.8723 25.9914L7.82979 26Z"
|
||||||
|
fill="#C4C4C4"
|
||||||
|
/>
|
||||||
</mask>
|
</mask>
|
||||||
<g mask="url(#mask0_87_7796)">
|
<g mask="url(#mask0_87_7796)">
|
||||||
<path d="M7.83017 26.0001C5.37824 26.0001 3.18957 24.8966 1.75391 23.1691L18.0429 16.3335L30.7089 23.4647C29.5926 24.9211 27.9066 26.0001 26.0004 25.9915C23.1254 26.0001 12.0629 26.0001 7.83017 26.0001Z" fill="url(#paint0_linear_87_7796)"/>
|
<path
|
||||||
<path d="M25.5785 13.3149L18.043 16.3334L30.709 23.4647C31.5199 22.4065 32.0004 21.0916 32.0004 19.6669C32.0004 16.1857 29.1321 13.3605 25.5833 13.3337C25.5817 13.3274 25.5801 13.3212 25.5785 13.3149Z" fill="url(#paint1_linear_87_7796)"/>
|
d="M7.83017 26.0001C5.37824 26.0001 3.18957 24.8966 1.75391 23.1691L18.0429 16.3335L30.7089 23.4647C29.5926 24.9211 27.9066 26.0001 26.0004 25.9915C23.1254 26.0001 12.0629 26.0001 7.83017 26.0001Z"
|
||||||
<path d="M7.06445 10.7028L18.0423 16.3333L25.5779 13.3148C24.5051 9.11261 20.6237 6 15.9997 6C12.4141 6 9.27508 7.87166 7.54586 10.6716C7.3841 10.6773 7.22358 10.6877 7.06445 10.7028Z" fill="url(#paint2_linear_87_7796)"/>
|
fill="url(#paint0_linear_87_7796)"
|
||||||
<path d="M1.7535 23.1687L18.0425 16.3331L7.06471 10.7026C3.09947 11.0792 0 14.3517 0 18.3331C0 20.1665 0.657197 21.8495 1.7535 23.1687Z" fill="url(#paint3_linear_87_7796)"/>
|
/>
|
||||||
|
<path
|
||||||
|
d="M25.5785 13.3149L18.043 16.3334L30.709 23.4647C31.5199 22.4065 32.0004 21.0916 32.0004 19.6669C32.0004 16.1857 29.1321 13.3605 25.5833 13.3337C25.5817 13.3274 25.5801 13.3212 25.5785 13.3149Z"
|
||||||
|
fill="url(#paint1_linear_87_7796)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M7.06445 10.7028L18.0423 16.3333L25.5779 13.3148C24.5051 9.11261 20.6237 6 15.9997 6C12.4141 6 9.27508 7.87166 7.54586 10.6716C7.3841 10.6773 7.22358 10.6877 7.06445 10.7028Z"
|
||||||
|
fill="url(#paint2_linear_87_7796)"
|
||||||
|
/>
|
||||||
|
<path
|
||||||
|
d="M1.7535 23.1687L18.0425 16.3331L7.06471 10.7026C3.09947 11.0792 0 14.3517 0 18.3331C0 20.1665 0.657197 21.8495 1.7535 23.1687Z"
|
||||||
|
fill="url(#paint3_linear_87_7796)"
|
||||||
|
/>
|
||||||
</g>
|
</g>
|
||||||
<defs>
|
<defs>
|
||||||
<linearGradient id="paint0_linear_87_7796" x1="4.42591" y1="24.6668" x2="27.2309" y2="23.2764" gradientUnits="userSpaceOnUse">
|
<linearGradient
|
||||||
<stop stop-color="#2086B8"/>
|
id="paint0_linear_87_7796"
|
||||||
<stop offset="1" stop-color="#46D3F6"/>
|
x1="4.42591"
|
||||||
|
y1="24.6668"
|
||||||
|
x2="27.2309"
|
||||||
|
y2="23.2764"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stop-color="#2086B8" />
|
||||||
|
<stop offset="1" stop-color="#46D3F6" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint1_linear_87_7796" x1="23.8302" y1="19.6668" x2="30.2108" y2="15.2082" gradientUnits="userSpaceOnUse">
|
<linearGradient
|
||||||
<stop stop-color="#1694DB"/>
|
id="paint1_linear_87_7796"
|
||||||
<stop offset="1" stop-color="#62C3FE"/>
|
x1="23.8302"
|
||||||
|
y1="19.6668"
|
||||||
|
x2="30.2108"
|
||||||
|
y2="15.2082"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stop-color="#1694DB" />
|
||||||
|
<stop offset="1" stop-color="#62C3FE" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint2_linear_87_7796" x1="8.51037" y1="7.33333" x2="23.3335" y2="15.9348" gradientUnits="userSpaceOnUse">
|
<linearGradient
|
||||||
<stop stop-color="#0D3D78"/>
|
id="paint2_linear_87_7796"
|
||||||
<stop offset="1" stop-color="#063B83"/>
|
x1="8.51037"
|
||||||
|
y1="7.33333"
|
||||||
|
x2="23.3335"
|
||||||
|
y2="15.9348"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stop-color="#0D3D78" />
|
||||||
|
<stop offset="1" stop-color="#063B83" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient id="paint3_linear_87_7796" x1="-0.340429" y1="19.9998" x2="14.5634" y2="14.4649" gradientUnits="userSpaceOnUse">
|
<linearGradient
|
||||||
<stop stop-color="#16589B"/>
|
id="paint3_linear_87_7796"
|
||||||
<stop offset="1" stop-color="#1464B7"/>
|
x1="-0.340429"
|
||||||
|
y1="19.9998"
|
||||||
|
x2="14.5634"
|
||||||
|
y2="14.4649"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
>
|
||||||
|
<stop stop-color="#16589B" />
|
||||||
|
<stop offset="1" stop-color="#1464B7" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
</defs>
|
</defs>
|
||||||
</svg>
|
</svg>
|
||||||
|
@ -350,7 +350,7 @@
|
|||||||
{#if Object.keys(history?.messages ?? {}).length == 0}
|
{#if Object.keys(history?.messages ?? {}).length == 0}
|
||||||
<ChatPlaceholder
|
<ChatPlaceholder
|
||||||
modelIds={selectedModels}
|
modelIds={selectedModels}
|
||||||
atSelectedModel={atSelectedModel}
|
{atSelectedModel}
|
||||||
submitPrompt={async (p) => {
|
submitPrompt={async (p) => {
|
||||||
let text = p;
|
let text = p;
|
||||||
|
|
||||||
|
@ -213,8 +213,7 @@
|
|||||||
<div class="mx-auto max-w-2xl font-primary" in:fade={{ duration: 200, delay: 200 }}>
|
<div class="mx-auto max-w-2xl font-primary" in:fade={{ duration: 200, delay: 200 }}>
|
||||||
<div class="mx-5">
|
<div class="mx-5">
|
||||||
<Suggestions
|
<Suggestions
|
||||||
suggestionPrompts={
|
suggestionPrompts={atSelectedModel?.info?.meta?.suggestion_prompts ??
|
||||||
atSelectedModel?.info?.meta?.suggestion_prompts ??
|
|
||||||
models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
|
||||||
$config?.default_prompt_suggestions ??
|
$config?.default_prompt_suggestions ??
|
||||||
[]}
|
[]}
|
||||||
|
@ -622,7 +622,7 @@
|
|||||||
"Loading Kokoro.js...": "",
|
"Loading Kokoro.js...": "",
|
||||||
"Local": "ლოკალური",
|
"Local": "ლოკალური",
|
||||||
"Local Models": "ლოკალური მოდელები",
|
"Local Models": "ლოკალური მოდელები",
|
||||||
"Location access not allowed": "",
|
"Location access not allowed": "",
|
||||||
"Lost": "წაგება",
|
"Lost": "წაგება",
|
||||||
"LTR": "LTR",
|
"LTR": "LTR",
|
||||||
"Made by Open WebUI Community": "შექმნილია OpenWebUI საზოგადოების მიერ",
|
"Made by Open WebUI Community": "შექმნილია OpenWebUI საზოგადოების მიერ",
|
||||||
@ -726,7 +726,7 @@
|
|||||||
"Ollama API settings updated": "",
|
"Ollama API settings updated": "",
|
||||||
"Ollama Version": "Ollama ვერსია",
|
"Ollama Version": "Ollama ვერსია",
|
||||||
"On": "ჩართული",
|
"On": "ჩართული",
|
||||||
"OneDrive": "",
|
"OneDrive": "",
|
||||||
"Only alphanumeric characters and hyphens are allowed": "",
|
"Only alphanumeric characters and hyphens are allowed": "",
|
||||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "ბრძანების სტრიქონში დაშვებულია, მხოლოდ, ალფარიცხვითი სიმბოლოები და ტირეები.",
|
"Only alphanumeric characters and hyphens are allowed in the command string.": "ბრძანების სტრიქონში დაშვებულია, მხოლოდ, ალფარიცხვითი სიმბოლოები და ტირეები.",
|
||||||
"Only collections can be edited, create a new knowledge base to edit/add documents.": "",
|
"Only collections can be edited, create a new knowledge base to edit/add documents.": "",
|
||||||
|
@ -279,9 +279,9 @@ export const generateInitialsImage = (name) => {
|
|||||||
const initials =
|
const initials =
|
||||||
sanitizedName.length > 0
|
sanitizedName.length > 0
|
||||||
? sanitizedName[0] +
|
? sanitizedName[0] +
|
||||||
(sanitizedName.split(' ').length > 1
|
(sanitizedName.split(' ').length > 1
|
||||||
? sanitizedName[sanitizedName.lastIndexOf(' ') + 1]
|
? sanitizedName[sanitizedName.lastIndexOf(' ') + 1]
|
||||||
: '')
|
: '')
|
||||||
: '';
|
: '';
|
||||||
|
|
||||||
ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2);
|
ctx.fillText(initials.toUpperCase(), canvas.width / 2, canvas.height / 2);
|
||||||
@ -348,10 +348,10 @@ export const compareVersion = (latest, current) => {
|
|||||||
return current === '0.0.0'
|
return current === '0.0.0'
|
||||||
? false
|
? false
|
||||||
: current.localeCompare(latest, undefined, {
|
: current.localeCompare(latest, undefined, {
|
||||||
numeric: true,
|
numeric: true,
|
||||||
sensitivity: 'case',
|
sensitivity: 'case',
|
||||||
caseFirst: 'upper'
|
caseFirst: 'upper'
|
||||||
}) < 0;
|
}) < 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const findWordIndices = (text) => {
|
export const findWordIndices = (text) => {
|
||||||
|
@ -1,266 +1,266 @@
|
|||||||
let CLIENT_ID = '';
|
let CLIENT_ID = '';
|
||||||
|
|
||||||
async function getCredentials() {
|
async function getCredentials() {
|
||||||
if (CLIENT_ID) return;
|
if (CLIENT_ID) return;
|
||||||
const response = await fetch('/api/config');
|
const response = await fetch('/api/config');
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Failed to fetch OneDrive credentials');
|
throw new Error('Failed to fetch OneDrive credentials');
|
||||||
}
|
}
|
||||||
const config = await response.json();
|
const config = await response.json();
|
||||||
CLIENT_ID = config.onedrive?.client_id;
|
CLIENT_ID = config.onedrive?.client_id;
|
||||||
if (!CLIENT_ID) {
|
if (!CLIENT_ID) {
|
||||||
throw new Error('OneDrive client ID not configured');
|
throw new Error('OneDrive client ID not configured');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadMsalScript(): Promise<void> {
|
function loadMsalScript(): Promise<void> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const win = window;
|
const win = window;
|
||||||
if (win.msal) {
|
if (win.msal) {
|
||||||
resolve();
|
resolve();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const script = document.createElement('script');
|
const script = document.createElement('script');
|
||||||
script.src = 'https://alcdn.msauth.net/browser/2.19.0/js/msal-browser.min.js';
|
script.src = 'https://alcdn.msauth.net/browser/2.19.0/js/msal-browser.min.js';
|
||||||
script.async = true;
|
script.async = true;
|
||||||
script.onload = () => resolve();
|
script.onload = () => resolve();
|
||||||
script.onerror = () => reject(new Error('Failed to load MSAL script'));
|
script.onerror = () => reject(new Error('Failed to load MSAL script'));
|
||||||
document.head.appendChild(script);
|
document.head.appendChild(script);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let msalInstance: any;
|
let msalInstance: any;
|
||||||
|
|
||||||
// Initialize MSAL authentication
|
// Initialize MSAL authentication
|
||||||
async function initializeMsal() {
|
async function initializeMsal() {
|
||||||
if (!CLIENT_ID) {
|
if (!CLIENT_ID) {
|
||||||
await getCredentials();
|
await getCredentials();
|
||||||
}
|
}
|
||||||
const msalParams = {
|
const msalParams = {
|
||||||
auth: {
|
auth: {
|
||||||
authority: 'https://login.microsoftonline.com/consumers',
|
authority: 'https://login.microsoftonline.com/consumers',
|
||||||
clientId: CLIENT_ID
|
clientId: CLIENT_ID
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
await loadMsalScript();
|
await loadMsalScript();
|
||||||
const win = window;
|
const win = window;
|
||||||
msalInstance = new win.msal.PublicClientApplication(msalParams);
|
msalInstance = new win.msal.PublicClientApplication(msalParams);
|
||||||
if (msalInstance.initialize) {
|
if (msalInstance.initialize) {
|
||||||
await msalInstance.initialize();
|
await msalInstance.initialize();
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('MSAL initialization error:', error);
|
console.error('MSAL initialization error:', error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve OneDrive access token
|
// Retrieve OneDrive access token
|
||||||
async function getToken(): Promise<string> {
|
async function getToken(): Promise<string> {
|
||||||
const authParams = { scopes: ['OneDrive.ReadWrite'] };
|
const authParams = { scopes: ['OneDrive.ReadWrite'] };
|
||||||
let accessToken = '';
|
let accessToken = '';
|
||||||
try {
|
try {
|
||||||
await initializeMsal();
|
await initializeMsal();
|
||||||
const resp = await msalInstance.acquireTokenSilent(authParams);
|
const resp = await msalInstance.acquireTokenSilent(authParams);
|
||||||
accessToken = resp.accessToken;
|
accessToken = resp.accessToken;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
const resp = await msalInstance.loginPopup(authParams);
|
const resp = await msalInstance.loginPopup(authParams);
|
||||||
msalInstance.setActiveAccount(resp.account);
|
msalInstance.setActiveAccount(resp.account);
|
||||||
if (resp.idToken) {
|
if (resp.idToken) {
|
||||||
const resp2 = await msalInstance.acquireTokenSilent(authParams);
|
const resp2 = await msalInstance.acquireTokenSilent(authParams);
|
||||||
accessToken = resp2.accessToken;
|
accessToken = resp2.accessToken;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return accessToken;
|
return accessToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
const baseUrl = "https://onedrive.live.com/picker";
|
const baseUrl = 'https://onedrive.live.com/picker';
|
||||||
const params = {
|
const params = {
|
||||||
sdk: '8.0',
|
sdk: '8.0',
|
||||||
entry: {
|
entry: {
|
||||||
oneDrive: {
|
oneDrive: {
|
||||||
files: {}
|
files: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
authentication: {},
|
authentication: {},
|
||||||
messaging: {
|
messaging: {
|
||||||
origin: window?.location?.origin,
|
origin: window?.location?.origin,
|
||||||
channelId: crypto.randomUUID()
|
channelId: crypto.randomUUID()
|
||||||
},
|
},
|
||||||
typesAndSources: {
|
typesAndSources: {
|
||||||
mode: 'files',
|
mode: 'files',
|
||||||
pivots: {
|
pivots: {
|
||||||
oneDrive: true,
|
oneDrive: true,
|
||||||
recent: true
|
recent: true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Download file from OneDrive
|
// Download file from OneDrive
|
||||||
async function downloadOneDriveFile(fileInfo: any): Promise<Blob> {
|
async function downloadOneDriveFile(fileInfo: any): Promise<Blob> {
|
||||||
const accessToken = await getToken();
|
const accessToken = await getToken();
|
||||||
if (!accessToken) {
|
if (!accessToken) {
|
||||||
throw new Error('Unable to retrieve OneDrive access token.');
|
throw new Error('Unable to retrieve OneDrive access token.');
|
||||||
}
|
}
|
||||||
const fileInfoUrl = `${fileInfo["@sharePoint.endpoint"]}/drives/${fileInfo.parentReference.driveId}/items/${fileInfo.id}`;
|
const fileInfoUrl = `${fileInfo['@sharePoint.endpoint']}/drives/${fileInfo.parentReference.driveId}/items/${fileInfo.id}`;
|
||||||
const response = await fetch(fileInfoUrl, {
|
const response = await fetch(fileInfoUrl, {
|
||||||
headers: {
|
headers: {
|
||||||
'Authorization': `Bearer ${accessToken}`
|
Authorization: `Bearer ${accessToken}`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error('Failed to fetch file information.');
|
throw new Error('Failed to fetch file information.');
|
||||||
}
|
}
|
||||||
const fileData = await response.json();
|
const fileData = await response.json();
|
||||||
const downloadUrl = fileData['@content.downloadUrl'];
|
const downloadUrl = fileData['@content.downloadUrl'];
|
||||||
const downloadResponse = await fetch(downloadUrl);
|
const downloadResponse = await fetch(downloadUrl);
|
||||||
if (!downloadResponse.ok) {
|
if (!downloadResponse.ok) {
|
||||||
throw new Error('Failed to download file.');
|
throw new Error('Failed to download file.');
|
||||||
}
|
}
|
||||||
return await downloadResponse.blob();
|
return await downloadResponse.blob();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open OneDrive file picker and return selected file metadata
|
// Open OneDrive file picker and return selected file metadata
|
||||||
export async function openOneDrivePicker(): Promise<any | null> {
|
export async function openOneDrivePicker(): Promise<any | null> {
|
||||||
if (typeof window === 'undefined') {
|
if (typeof window === 'undefined') {
|
||||||
throw new Error('Not in browser environment');
|
throw new Error('Not in browser environment');
|
||||||
}
|
}
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let pickerWindow: Window | null = null;
|
let pickerWindow: Window | null = null;
|
||||||
let channelPort: MessagePort | null = null;
|
let channelPort: MessagePort | null = null;
|
||||||
|
|
||||||
const handleWindowMessage = (event: MessageEvent) => {
|
const handleWindowMessage = (event: MessageEvent) => {
|
||||||
if (event.source !== pickerWindow) return;
|
if (event.source !== pickerWindow) return;
|
||||||
const message = event.data;
|
const message = event.data;
|
||||||
if (message?.type === 'initialize' && message?.channelId === params.messaging.channelId) {
|
if (message?.type === 'initialize' && message?.channelId === params.messaging.channelId) {
|
||||||
channelPort = event.ports?.[0];
|
channelPort = event.ports?.[0];
|
||||||
if (!channelPort) return;
|
if (!channelPort) return;
|
||||||
channelPort.addEventListener('message', handlePortMessage);
|
channelPort.addEventListener('message', handlePortMessage);
|
||||||
channelPort.start();
|
channelPort.start();
|
||||||
channelPort.postMessage({ type: 'activate' });
|
channelPort.postMessage({ type: 'activate' });
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handlePortMessage = async (portEvent: MessageEvent) => {
|
const handlePortMessage = async (portEvent: MessageEvent) => {
|
||||||
const portData = portEvent.data;
|
const portData = portEvent.data;
|
||||||
switch (portData.type) {
|
switch (portData.type) {
|
||||||
case 'notification':
|
case 'notification':
|
||||||
break;
|
break;
|
||||||
case 'command': {
|
case 'command': {
|
||||||
channelPort?.postMessage({ type: 'acknowledge', id: portData.id });
|
channelPort?.postMessage({ type: 'acknowledge', id: portData.id });
|
||||||
const command = portData.data;
|
const command = portData.data;
|
||||||
switch (command.command) {
|
switch (command.command) {
|
||||||
case 'authenticate': {
|
case 'authenticate': {
|
||||||
try {
|
try {
|
||||||
const newToken = await getToken();
|
const newToken = await getToken();
|
||||||
if (newToken) {
|
if (newToken) {
|
||||||
channelPort?.postMessage({
|
channelPort?.postMessage({
|
||||||
type: 'result',
|
type: 'result',
|
||||||
id: portData.id,
|
id: portData.id,
|
||||||
data: { result: 'token', token: newToken }
|
data: { result: 'token', token: newToken }
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
throw new Error('Could not retrieve auth token');
|
throw new Error('Could not retrieve auth token');
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
channelPort?.postMessage({
|
channelPort?.postMessage({
|
||||||
result: 'error',
|
result: 'error',
|
||||||
error: { code: 'tokenError', message: 'Failed to get token' },
|
error: { code: 'tokenError', message: 'Failed to get token' },
|
||||||
isExpected: true
|
isExpected: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'close': {
|
case 'close': {
|
||||||
cleanup();
|
cleanup();
|
||||||
resolve(null);
|
resolve(null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'pick': {
|
case 'pick': {
|
||||||
channelPort?.postMessage({
|
channelPort?.postMessage({
|
||||||
type: 'result',
|
type: 'result',
|
||||||
id: portData.id,
|
id: portData.id,
|
||||||
data: { result: 'success' }
|
data: { result: 'success' }
|
||||||
});
|
});
|
||||||
cleanup();
|
cleanup();
|
||||||
resolve(command);
|
resolve(command);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
console.warn('Unsupported command:', command);
|
console.warn('Unsupported command:', command);
|
||||||
channelPort?.postMessage({
|
channelPort?.postMessage({
|
||||||
result: 'error',
|
result: 'error',
|
||||||
error: { code: 'unsupportedCommand', message: command.command },
|
error: { code: 'unsupportedCommand', message: command.command },
|
||||||
isExpected: true
|
isExpected: true
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function cleanup() {
|
function cleanup() {
|
||||||
window.removeEventListener('message', handleWindowMessage);
|
window.removeEventListener('message', handleWindowMessage);
|
||||||
if (channelPort) {
|
if (channelPort) {
|
||||||
channelPort.removeEventListener('message', handlePortMessage);
|
channelPort.removeEventListener('message', handlePortMessage);
|
||||||
}
|
}
|
||||||
if (pickerWindow) {
|
if (pickerWindow) {
|
||||||
pickerWindow.close();
|
pickerWindow.close();
|
||||||
pickerWindow = null;
|
pickerWindow = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const initializePicker = async () => {
|
const initializePicker = async () => {
|
||||||
try {
|
try {
|
||||||
const authToken = await getToken();
|
const authToken = await getToken();
|
||||||
if (!authToken) {
|
if (!authToken) {
|
||||||
return reject(new Error('Failed to acquire access token'));
|
return reject(new Error('Failed to acquire access token'));
|
||||||
}
|
}
|
||||||
pickerWindow = window.open('', 'OneDrivePicker', 'width=800,height=600');
|
pickerWindow = window.open('', 'OneDrivePicker', 'width=800,height=600');
|
||||||
if (!pickerWindow) {
|
if (!pickerWindow) {
|
||||||
return reject(new Error('Failed to open OneDrive picker window'));
|
return reject(new Error('Failed to open OneDrive picker window'));
|
||||||
}
|
}
|
||||||
const queryString = new URLSearchParams({
|
const queryString = new URLSearchParams({
|
||||||
filePicker: JSON.stringify(params)
|
filePicker: JSON.stringify(params)
|
||||||
});
|
});
|
||||||
const url = `${baseUrl}?${queryString.toString()}`;
|
const url = `${baseUrl}?${queryString.toString()}`;
|
||||||
const form = pickerWindow.document.createElement('form');
|
const form = pickerWindow.document.createElement('form');
|
||||||
form.setAttribute('action', url);
|
form.setAttribute('action', url);
|
||||||
form.setAttribute('method', 'POST');
|
form.setAttribute('method', 'POST');
|
||||||
const input = pickerWindow.document.createElement('input');
|
const input = pickerWindow.document.createElement('input');
|
||||||
input.setAttribute('type', 'hidden');
|
input.setAttribute('type', 'hidden');
|
||||||
input.setAttribute('name', 'access_token');
|
input.setAttribute('name', 'access_token');
|
||||||
input.setAttribute('value', authToken);
|
input.setAttribute('value', authToken);
|
||||||
form.appendChild(input);
|
form.appendChild(input);
|
||||||
pickerWindow.document.body.appendChild(form);
|
pickerWindow.document.body.appendChild(form);
|
||||||
form.submit();
|
form.submit();
|
||||||
window.addEventListener('message', handleWindowMessage);
|
window.addEventListener('message', handleWindowMessage);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (pickerWindow) pickerWindow.close();
|
if (pickerWindow) pickerWindow.close();
|
||||||
reject(err);
|
reject(err);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
initializePicker();
|
initializePicker();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pick and download file from OneDrive
|
// Pick and download file from OneDrive
|
||||||
export async function pickAndDownloadFile(): Promise<{ blob: Blob; name: string } | null> {
|
export async function pickAndDownloadFile(): Promise<{ blob: Blob; name: string } | null> {
|
||||||
try {
|
try {
|
||||||
const pickerResult = await openOneDrivePicker();
|
const pickerResult = await openOneDrivePicker();
|
||||||
if (!pickerResult || !pickerResult.items || pickerResult.items.length === 0) {
|
if (!pickerResult || !pickerResult.items || pickerResult.items.length === 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const selectedFile = pickerResult.items[0];
|
const selectedFile = pickerResult.items[0];
|
||||||
const blob = await downloadOneDriveFile(selectedFile);
|
const blob = await downloadOneDriveFile(selectedFile);
|
||||||
return { blob, name: selectedFile.name };
|
return { blob, name: selectedFile.name };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error occurred during OneDrive file pick/download:', error);
|
console.error('Error occurred during OneDrive file pick/download:', error);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { downloadOneDriveFile };
|
export { downloadOneDriveFile };
|
||||||
|
Loading…
Reference in New Issue
Block a user