@fayz-ai/admin 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{CommandPalette-GQ6SPITD.js → CommandPalette-ANZWU27U.js} +5 -5
- package/dist/CommandPalette-ANZWU27U.js.map +1 -0
- package/dist/ScheduleEditor-KU4UUG6Q.js +7 -0
- package/dist/ScheduleEditor-KU4UUG6Q.js.map +1 -0
- package/dist/SubscriptionPage-4EJCCS4I.js +8 -0
- package/dist/{SubscriptionPage-KYMUCZRW.js.map → SubscriptionPage-4EJCCS4I.js.map} +1 -1
- package/dist/app/AdminShell.d.ts +2 -0
- package/dist/app/AdminShell.d.ts.map +1 -1
- package/dist/app/WrongAppGate.d.ts +46 -0
- package/dist/app/WrongAppGate.d.ts.map +1 -0
- package/dist/app/admin-app.d.ts.map +1 -1
- package/dist/app/app-config-cache.d.ts +13 -0
- package/dist/app/app-config-cache.d.ts.map +1 -0
- package/dist/app/contextual-nav.store.d.ts +11 -0
- package/dist/app/contextual-nav.store.d.ts.map +1 -1
- package/dist/app/nav-serving.d.ts +40 -0
- package/dist/app/nav-serving.d.ts.map +1 -0
- package/dist/app/nav-waiting.d.ts +23 -0
- package/dist/app/nav-waiting.d.ts.map +1 -0
- package/dist/app/rail-preset.d.ts +38 -0
- package/dist/app/rail-preset.d.ts.map +1 -0
- package/dist/app/scaffold.d.ts.map +1 -1
- package/dist/app/useAppPreset.d.ts +81 -0
- package/dist/app/useAppPreset.d.ts.map +1 -0
- package/dist/app/useDomainTenant.d.ts +32 -0
- package/dist/app/useDomainTenant.d.ts.map +1 -0
- package/dist/app/useTenantShell.d.ts +35 -0
- package/dist/app/useTenantShell.d.ts.map +1 -0
- package/dist/billing/TrialWidget.d.ts +1 -1
- package/dist/billing/TrialWidget.d.ts.map +1 -1
- package/dist/billing/index.js +2 -2
- package/dist/{chunk-CRB4ZUFH.js → chunk-LB5SV4ZZ.js} +6 -6
- package/dist/{chunk-CRB4ZUFH.js.map → chunk-LB5SV4ZZ.js.map} +1 -1
- package/dist/{ScheduleEditor-B7PLFGVM.js → chunk-NXFFJY2X.js} +44 -8
- package/dist/chunk-NXFFJY2X.js.map +1 -0
- package/dist/{chunk-NB6X5O5L.js → chunk-R4HQ2HS2.js} +22 -6
- package/dist/chunk-R4HQ2HS2.js.map +1 -0
- package/dist/{chunk-SHHWE7R2.js → chunk-U3VX52SE.js} +5 -6
- package/dist/chunk-U3VX52SE.js.map +1 -0
- package/dist/{chunk-WJ3H3RJN.js → chunk-UQ2NTFQC.js} +4 -2
- package/dist/chunk-UQ2NTFQC.js.map +1 -0
- package/dist/{chunk-5GWUM4SM.js → chunk-W5IBKM3K.js} +3 -2
- package/dist/chunk-W5IBKM3K.js.map +1 -0
- package/dist/{chunk-ZKOWNGZT.js → chunk-XJB76FHA.js} +216 -72
- package/dist/chunk-XJB76FHA.js.map +1 -0
- package/dist/components/RightRail.d.ts.map +1 -1
- package/dist/components/chat/AgentAvatar.d.ts +6 -1
- package/dist/components/chat/AgentAvatar.d.ts.map +1 -1
- package/dist/components/chat/AssistantInvite.d.ts.map +1 -1
- package/dist/components/chat/ChatConversation.d.ts.map +1 -1
- package/dist/components/chat/ChatFab.d.ts.map +1 -1
- package/dist/components/layout/CommandPalette.d.ts +5 -1
- package/dist/components/layout/CommandPalette.d.ts.map +1 -1
- package/dist/components/layout/PrintChrome.d.ts.map +1 -1
- package/dist/components/right-rail.d.ts +2 -0
- package/dist/components/right-rail.d.ts.map +1 -1
- package/dist/components/settings/AddModulesPanel.d.ts +45 -0
- package/dist/components/settings/AddModulesPanel.d.ts.map +1 -0
- package/dist/components/settings/BrandingSettings.d.ts.map +1 -1
- package/dist/components/settings/ConnectedModulesSettings.d.ts +5 -0
- package/dist/components/settings/ConnectedModulesSettings.d.ts.map +1 -0
- package/dist/components/settings/ModuleCard.d.ts +26 -0
- package/dist/components/settings/ModuleCard.d.ts.map +1 -0
- package/dist/components/settings/ModulesSettings.d.ts +48 -0
- package/dist/components/settings/ModulesSettings.d.ts.map +1 -0
- package/dist/components/settings/SettingsPage.d.ts.map +1 -1
- package/dist/components/settings/module-catalog.d.ts +58 -0
- package/dist/components/settings/module-catalog.d.ts.map +1 -0
- package/dist/crud/CrudFormPage.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailRail.d.ts.map +1 -1
- package/dist/crud/archetypes/OrderDetailView.d.ts +44 -0
- package/dist/crud/archetypes/OrderDetailView.d.ts.map +1 -1
- package/dist/directory/AppSwitcher.d.ts +6 -2
- package/dist/directory/AppSwitcher.d.ts.map +1 -1
- package/dist/handbook/NotebookPanel.d.ts.map +1 -1
- package/dist/hooks/useAppConfig.d.ts +8 -0
- package/dist/hooks/useAppConfig.d.ts.map +1 -1
- package/dist/hooks/useChat.d.ts.map +1 -1
- package/dist/hooks/useLayout.d.ts +4 -1
- package/dist/hooks/useLayout.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2171 -1030
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-surface.d.ts +8 -1
- package/dist/lib/agent-surface.d.ts.map +1 -1
- package/dist/lib/ai-tool-handlers.d.ts.map +1 -1
- package/dist/lib/brand.d.ts +45 -0
- package/dist/lib/brand.d.ts.map +1 -1
- package/dist/lib/search-targets.d.ts.map +1 -1
- package/dist/org/OrgMark.d.ts +41 -0
- package/dist/org/OrgMark.d.ts.map +1 -0
- package/dist/org/WorkspaceChooser.d.ts +1 -0
- package/dist/org/WorkspaceChooser.d.ts.map +1 -1
- package/dist/org/WorkspaceChooserGate.d.ts.map +1 -1
- package/dist/org/WorkspaceSwitching.d.ts.map +1 -1
- package/dist/org/context.d.ts +13 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/index.d.ts +2 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +4 -4
- package/dist/org/switching.store.d.ts.map +1 -1
- package/dist/org/workspace-search.d.ts +27 -0
- package/dist/org/workspace-search.d.ts.map +1 -0
- package/dist/permissions/index.js +1 -1
- package/dist/permissions/store.d.ts +12 -0
- package/dist/permissions/store.d.ts.map +1 -1
- package/dist/setup/SetupAgentSurface.d.ts.map +1 -1
- package/dist/stores/app-config.store.d.ts +5 -1
- package/dist/stores/app-config.store.d.ts.map +1 -1
- package/dist/tasks/components/TasksFilterBar.d.ts.map +1 -1
- package/dist/theme/dark.d.ts.map +1 -1
- package/dist/theme/light.d.ts.map +1 -1
- package/dist/theme/tokens.d.ts +13 -0
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/utils.d.ts.map +1 -1
- package/dist/units/UnitSwitcher.d.ts +10 -1
- package/dist/units/UnitSwitcher.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/CommandPalette-GQ6SPITD.js.map +0 -1
- package/dist/ScheduleEditor-B7PLFGVM.js.map +0 -1
- package/dist/SubscriptionPage-KYMUCZRW.js +0 -8
- package/dist/chunk-5GWUM4SM.js.map +0 -1
- package/dist/chunk-NB6X5O5L.js.map +0 -1
- package/dist/chunk-RKXZ7RUG.js +0 -20
- package/dist/chunk-RKXZ7RUG.js.map +0 -1
- package/dist/chunk-SHHWE7R2.js.map +0 -1
- package/dist/chunk-WJ3H3RJN.js.map +0 -1
- package/dist/chunk-ZKOWNGZT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/org/store.ts"],"names":[],"mappings":";;;;;AAGA,IAAM,WAAA,GAAc,kBAAA;AAMpB,SAAS,iBAAA,GAAmC;AAC1C,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,IAAA,OAAO,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,aAAa,KAAA,EAA4B;AAChD,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,KAAK,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,WAAW,WAAW,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAuBO,IAAM,oBAAA,GAAuB,MAAA,CAAiB,CAAC,GAAA,MAAS;AAAA,EAC7D,UAAA,EAAY,IAAA;AAAA,EACZ,UAAU,EAAC;AAAA,EACX,SAAS,EAAC;AAAA,EACV,iBAAiB,EAAC;AAAA,EAClB,OAAA,EAAS,KAAA;AAAA,EAET,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,IAAA,iBAAA,CAAkB,KAAK,EAAE,CAAA;AACzB,IAAA,YAAA,CAAa,GAAA,EAAK,MAAM,IAAI,CAAA;AAC5B,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,GAAA,EAAK,CAAA;AAAA,EACzB,CAAA;AAAA,EACA,aAAa,CAAC,IAAA,KAAS,IAAI,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAC7C,YAAY,CAAC,OAAA,KAAY,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,EACxC,oBAAoB,CAAC,KAAA,KAAU,IAAI,EAAE,eAAA,EAAiB,OAAO,CAAA;AAAA,EAC7D,YAAY,CAAC,OAAA,KAAY,GAAA,CAAI,EAAE,SAAS,CAAA;AAAA,EACxC,OAAO,MAAM;AACX,IAAA,iBAAA,CAAkB,MAAS,CAAA;AAU3B,IAAA,GAAA,CAAI,EAAE,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,EAAC,EAAG,OAAA,EAAS,EAAC,EAAG,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EACrE;AACF,CAAA,CAAE","file":"chunk-W5IBKM3K.js","sourcesContent":["import { create } from 'zustand'\nimport { setActiveTenantId, type Organization, type OrgMember, type OrgMembership } from '@fayz-ai/core'\n\nconst STORAGE_KEY = 'fayz:current-org'\n\n// ---------------------------------------------------------------------------\n// Persistence helpers\n// ---------------------------------------------------------------------------\n\nfunction getPersistedOrgId(): string | null {\n try {\n if (typeof localStorage === 'undefined') return null\n return localStorage.getItem(STORAGE_KEY)\n } catch {\n return null\n }\n}\n\nfunction persistOrgId(orgId: string | null): void {\n try {\n if (typeof localStorage === 'undefined') return\n if (orgId) {\n localStorage.setItem(STORAGE_KEY, orgId)\n } else {\n localStorage.removeItem(STORAGE_KEY)\n }\n } catch {\n // ignore\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store interface\n// ---------------------------------------------------------------------------\n\nexport interface OrgStore {\n currentOrg: Organization | null\n userOrgs: OrgMembership[]\n members: OrgMember[]\n /** Person `kind`s that make up the team (from config.team.personKinds). Drives\n * the Person-first Team screen; empty = legacy membership-only mode. */\n teamPersonKinds: string[]\n loading: boolean\n\n setCurrentOrg: (org: Organization | null) => void\n setUserOrgs: (orgs: OrgMembership[]) => void\n setMembers: (members: OrgMember[]) => void\n setTeamPersonKinds: (kinds: string[]) => void\n setLoading: (loading: boolean) => void\n reset: () => void\n}\n\nexport const useOrganizationStore = create<OrgStore>((set) => ({\n currentOrg: null,\n userOrgs: [],\n members: [],\n teamPersonKinds: [],\n loading: false,\n\n setCurrentOrg: (org) => {\n setActiveTenantId(org?.id)\n persistOrgId(org?.id ?? null)\n set({ currentOrg: org })\n },\n setUserOrgs: (orgs) => set({ userOrgs: orgs }),\n setMembers: (members) => set({ members }),\n setTeamPersonKinds: (kinds) => set({ teamPersonKinds: kinds }),\n setLoading: (loading) => set({ loading }),\n reset: () => {\n setActiveTenantId(undefined)\n // NOTE: do NOT clear the persisted org id here. The org providers call\n // reset() whenever the auth store transiently reports `user === null` —\n // which happens on every fresh load while the Supabase session hydrates\n // asynchronously. Wiping 'fayz:current-org' at that moment drops a\n // multi-org user's workspace selection BEFORE loadOrgs can read it back,\n // so the app always falls to memberships[0] on reload (single-org users\n // never noticed). The pin is a last-selected hint that's re-validated\n // against the fresh membership list on load, so it's safe to keep across\n // sign-out too (a mismatching pin just falls back to memberships[0]).\n set({ currentOrg: null, userOrgs: [], members: [], loading: false })\n },\n}))\n\nexport { getPersistedOrgId, persistOrgId }\n"]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-
|
|
2
|
-
import { persistOrgId, getPersistedOrgId } from './chunk-
|
|
1
|
+
import { markWorkspaceSwitch, clearOrgSnapshot, useTenant, useTenantOptional, setAutoPick } from './chunk-R4HQ2HS2.js';
|
|
2
|
+
import { persistOrgId, cn, getPersistedOrgId } from './chunk-W5IBKM3K.js';
|
|
3
3
|
import { createClient } from '@supabase/supabase-js';
|
|
4
|
-
import { getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation } from '@fayz-ai/core';
|
|
4
|
+
import { EMPTY_APP_CONFIG, getActiveUnitId, getActiveTenantId, setGlobalSupabaseClient, useTranslation, getSupabaseClientOptional as getSupabaseClientOptional$1 } from '@fayz-ai/core';
|
|
5
5
|
import { createDedupedFetch } from '@fayz-ai/sdk';
|
|
6
|
-
import * as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
import * as React from 'react';
|
|
7
|
+
import { useState, useEffect } from 'react';
|
|
8
|
+
import { Building2, Check, ShieldCheck } from 'lucide-react';
|
|
10
9
|
import { create } from 'zustand';
|
|
10
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
11
|
+
import { cn as cn$1, Checkbox, Button } from '@fayz-ai/ui';
|
|
11
12
|
|
|
12
13
|
var _client = null;
|
|
13
14
|
function requestUrl(input) {
|
|
@@ -922,6 +923,89 @@ function createMockOrgAdapter(defaultProfiles) {
|
|
|
922
923
|
}
|
|
923
924
|
};
|
|
924
925
|
}
|
|
926
|
+
var initialState = {
|
|
927
|
+
config: EMPTY_APP_CONFIG,
|
|
928
|
+
tenantId: null,
|
|
929
|
+
initializing: true,
|
|
930
|
+
stale: false,
|
|
931
|
+
error: null
|
|
932
|
+
};
|
|
933
|
+
var useAppConfigStore = create((set) => ({
|
|
934
|
+
...initialState,
|
|
935
|
+
setConfig: (config, tenantId) => set({
|
|
936
|
+
config,
|
|
937
|
+
tenantId: tenantId === void 0 ? config.tenant_id ?? null : tenantId,
|
|
938
|
+
initializing: false,
|
|
939
|
+
stale: false,
|
|
940
|
+
error: null
|
|
941
|
+
}),
|
|
942
|
+
// Não limpa o que está em tela: quem espera desenha esqueleto, e um esqueleto
|
|
943
|
+
// sobre a última resposta é melhor que um branco.
|
|
944
|
+
beginTenant: (tenantId) => set({ tenantId, initializing: true, error: null }),
|
|
945
|
+
setStale: (stale) => set({ stale }),
|
|
946
|
+
setError: (error) => set({ error, initializing: false, stale: false }),
|
|
947
|
+
reset: () => set(initialState)
|
|
948
|
+
}));
|
|
949
|
+
function activePluginIds(config) {
|
|
950
|
+
return [...new Set(config.plugins.filter((p) => p.status === "active").map((p) => p.plugin))];
|
|
951
|
+
}
|
|
952
|
+
function hasPlugin(config, plugin, facet) {
|
|
953
|
+
const wanted = facet ?? "";
|
|
954
|
+
return config.plugins.some(
|
|
955
|
+
(p) => p.plugin === plugin && (p.facet ?? "") === wanted && p.status === "active"
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
function orgInitials(name) {
|
|
959
|
+
const words = name.trim().split(/\s+/).filter(Boolean);
|
|
960
|
+
if (!words.length) return "?";
|
|
961
|
+
if (words.length === 1) return words[0].slice(0, 2).toUpperCase();
|
|
962
|
+
return (words[0][0] + words[words.length - 1][0]).toUpperCase();
|
|
963
|
+
}
|
|
964
|
+
function OrgMark({ name, logoUrl, className, tone = "sidebar", current = false }) {
|
|
965
|
+
const identity = useAppConfigStore((state) => state.config.branding?.identity);
|
|
966
|
+
const pick = (key) => typeof identity?.[key] === "string" ? identity[key] : void 0;
|
|
967
|
+
const src = (current ? pick("markUrl") : void 0) ?? logoUrl;
|
|
968
|
+
const base = cn(
|
|
969
|
+
"shrink-0 overflow-hidden rounded-lg ring-1 ring-inset",
|
|
970
|
+
tone === "popover" ? "ring-black/5" : "ring-white/10",
|
|
971
|
+
className ?? "h-6 w-6"
|
|
972
|
+
);
|
|
973
|
+
if (src) return /* @__PURE__ */ jsx("img", { src, alt: "", className: cn(base, "object-cover") });
|
|
974
|
+
return /* @__PURE__ */ jsx(
|
|
975
|
+
"span",
|
|
976
|
+
{
|
|
977
|
+
"aria-hidden": true,
|
|
978
|
+
className: cn(
|
|
979
|
+
base,
|
|
980
|
+
"flex items-center justify-center text-[10px] font-semibold uppercase leading-none tracking-tight",
|
|
981
|
+
tone === "popover" ? "bg-muted text-foreground" : "bg-sidebar-accent text-sidebar-accent-foreground"
|
|
982
|
+
),
|
|
983
|
+
children: orgInitials(name) || /* @__PURE__ */ jsx(Building2, { className: "h-3.5 w-3.5" })
|
|
984
|
+
}
|
|
985
|
+
);
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
// src/org/workspace-search.ts
|
|
989
|
+
var WORKSPACE_SEARCH_THRESHOLD = 8;
|
|
990
|
+
var WORKSPACE_VISIBLE_LIMIT = 7;
|
|
991
|
+
function foldName(value) {
|
|
992
|
+
return value.normalize("NFD").replace(/[̀-ͯ]/g, "").toLowerCase();
|
|
993
|
+
}
|
|
994
|
+
function searchWorkspaces(all, query, currentId, limit = WORKSPACE_VISIBLE_LIMIT) {
|
|
995
|
+
const searchable = all.length > WORKSPACE_SEARCH_THRESHOLD;
|
|
996
|
+
if (!searchable) return { visible: all, hidden: 0, searchable: false };
|
|
997
|
+
const q = foldName(query.trim());
|
|
998
|
+
const matched = q ? all.filter((w) => foldName(w.orgName).includes(q)) : all;
|
|
999
|
+
const current = all.find((w) => w.orgId === currentId);
|
|
1000
|
+
const head = current && !matched.includes(current) ? [current] : [];
|
|
1001
|
+
const rest = matched.filter((w) => w.orgId !== current?.orgId);
|
|
1002
|
+
const ordered = current && matched.includes(current) ? [current, ...rest] : [...head, ...rest];
|
|
1003
|
+
return {
|
|
1004
|
+
visible: ordered.slice(0, limit),
|
|
1005
|
+
hidden: Math.max(0, ordered.length - limit),
|
|
1006
|
+
searchable: true
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
925
1009
|
function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
|
|
926
1010
|
const t = useTranslation();
|
|
927
1011
|
const tr = (key, fallback) => {
|
|
@@ -929,11 +1013,16 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
|
|
|
929
1013
|
return !v || v === key ? fallback : v;
|
|
930
1014
|
};
|
|
931
1015
|
const { switchOrg } = useTenant();
|
|
932
|
-
const [selected, setSelected] =
|
|
1016
|
+
const [selected, setSelected] = React.useState(
|
|
933
1017
|
suggestedId ?? memberships[0]?.orgId ?? null
|
|
934
1018
|
);
|
|
935
|
-
const [remember, setRemember] =
|
|
936
|
-
const [
|
|
1019
|
+
const [remember, setRemember] = React.useState(false);
|
|
1020
|
+
const [query, setQuery] = React.useState("");
|
|
1021
|
+
const search = React.useMemo(
|
|
1022
|
+
() => searchWorkspaces(memberships, query, selected, 12),
|
|
1023
|
+
[memberships, query, selected]
|
|
1024
|
+
);
|
|
1025
|
+
const [entering, setEntering] = React.useState(false);
|
|
937
1026
|
const enter = async (orgId) => {
|
|
938
1027
|
if (entering) return;
|
|
939
1028
|
setEntering(true);
|
|
@@ -952,46 +1041,60 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
|
|
|
952
1041
|
"Voc\xEA tem acesso a mais de uma. Selecione em qual deseja entrar."
|
|
953
1042
|
) })
|
|
954
1043
|
] }),
|
|
955
|
-
/* @__PURE__ */ jsx(
|
|
1044
|
+
search.searchable && /* @__PURE__ */ jsx(
|
|
1045
|
+
"input",
|
|
1046
|
+
{
|
|
1047
|
+
value: query,
|
|
1048
|
+
onChange: (e) => setQuery(e.target.value),
|
|
1049
|
+
placeholder: tr("organization.searchWorkspace", "Buscar conta\u2026"),
|
|
1050
|
+
autoFocus: true,
|
|
1051
|
+
className: "mb-3 w-full rounded-lg border border-border bg-card px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground focus:border-primary"
|
|
1052
|
+
}
|
|
1053
|
+
),
|
|
1054
|
+
/* @__PURE__ */ jsxs(
|
|
956
1055
|
"div",
|
|
957
1056
|
{
|
|
958
1057
|
role: "radiogroup",
|
|
959
1058
|
"aria-label": tr("organization.workspaces", "Workspaces"),
|
|
960
1059
|
className: "space-y-2",
|
|
961
|
-
children:
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
/* @__PURE__ */ jsx(
|
|
982
|
-
/* @__PURE__ */ jsxs("span", { className: "
|
|
983
|
-
m.
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
1060
|
+
children: [
|
|
1061
|
+
search.visible.length === 0 && /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: tr("organization.noWorkspaceMatch", "Nenhuma conta com esse nome.") }),
|
|
1062
|
+
search.visible.map((m) => {
|
|
1063
|
+
const isSelected = m.orgId === selected;
|
|
1064
|
+
const isSuggested = m.orgId === suggestedId;
|
|
1065
|
+
return /* @__PURE__ */ jsxs(
|
|
1066
|
+
"button",
|
|
1067
|
+
{
|
|
1068
|
+
type: "button",
|
|
1069
|
+
role: "radio",
|
|
1070
|
+
"aria-checked": isSelected,
|
|
1071
|
+
disabled: entering,
|
|
1072
|
+
onClick: () => setSelected(m.orgId),
|
|
1073
|
+
onDoubleClick: () => void enter(m.orgId),
|
|
1074
|
+
className: cn$1(
|
|
1075
|
+
"flex w-full items-center gap-3 rounded-lg border p-3 text-left transition-colors",
|
|
1076
|
+
"disabled:opacity-60",
|
|
1077
|
+
isSelected ? "border-primary bg-primary/5" : "border-border hover:border-primary/50 hover:bg-muted/50"
|
|
1078
|
+
),
|
|
1079
|
+
children: [
|
|
1080
|
+
/* @__PURE__ */ jsx(OrgMark, { name: m.orgName, logoUrl: m.orgLogoUrl, tone: "popover", className: "h-9 w-9" }),
|
|
1081
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
|
|
1082
|
+
/* @__PURE__ */ jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: m.orgName || m.orgSlug || m.orgId }),
|
|
1083
|
+
/* @__PURE__ */ jsxs("span", { className: "block truncate text-xs text-muted-foreground", children: [
|
|
1084
|
+
m.profileName,
|
|
1085
|
+
isSuggested && ` \xB7 ${tr("organization.lastUsed", "\xFAltimo acesso")}`
|
|
1086
|
+
] })
|
|
1087
|
+
] }),
|
|
1088
|
+
isSelected && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 shrink-0 text-primary" })
|
|
1089
|
+
]
|
|
1090
|
+
},
|
|
1091
|
+
m.orgId
|
|
1092
|
+
);
|
|
1093
|
+
})
|
|
1094
|
+
]
|
|
993
1095
|
}
|
|
994
1096
|
),
|
|
1097
|
+
search.hidden > 0 && /* @__PURE__ */ jsx("p", { className: "mt-3 text-center text-xs text-muted-foreground", children: tr("organization.moreWorkspaces", "mais {n} \u2014 busque pelo nome").replace("{n}", String(search.hidden)) }),
|
|
995
1098
|
/* @__PURE__ */ jsxs("div", { className: "mt-5 flex items-center gap-2.5 text-sm text-muted-foreground", children: [
|
|
996
1099
|
/* @__PURE__ */ jsx(
|
|
997
1100
|
Checkbox,
|
|
@@ -1022,20 +1125,71 @@ function WorkspaceChooser({ memberships, suggestedId, onCancel }) {
|
|
|
1022
1125
|
) })
|
|
1023
1126
|
] }) });
|
|
1024
1127
|
}
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1128
|
+
var getSupabaseClientOptional = () => getSupabaseClientOptional$1();
|
|
1129
|
+
|
|
1130
|
+
// src/app/useDomainTenant.ts
|
|
1131
|
+
var LOCAL = /^(localhost|127\.0\.0\.1|\[::1\])$/;
|
|
1132
|
+
function resolveHostname() {
|
|
1133
|
+
if (typeof window === "undefined") return null;
|
|
1134
|
+
const host = window.location.hostname;
|
|
1135
|
+
if (!LOCAL.test(host)) return host;
|
|
1136
|
+
if (!import.meta.env?.DEV) return null;
|
|
1137
|
+
return new URLSearchParams(window.location.search).get("domain");
|
|
1138
|
+
}
|
|
1139
|
+
function useDomainTenant() {
|
|
1140
|
+
const [tenant, setTenant] = useState(null);
|
|
1141
|
+
const [resolving, setResolving] = useState(true);
|
|
1142
|
+
useEffect(() => {
|
|
1143
|
+
const host = resolveHostname();
|
|
1144
|
+
const supabase = getSupabaseClientOptional();
|
|
1145
|
+
if (!host || !supabase) {
|
|
1146
|
+
setResolving(false);
|
|
1147
|
+
return;
|
|
1148
|
+
}
|
|
1149
|
+
let cancelled = false;
|
|
1150
|
+
void (async () => {
|
|
1151
|
+
try {
|
|
1152
|
+
const { data } = await supabase.rpc("tenant_branding_public", { p_domain: host });
|
|
1153
|
+
const row = data;
|
|
1154
|
+
const id = typeof row?.tenant_id === "string" ? row.tenant_id : null;
|
|
1155
|
+
if (!cancelled && id) {
|
|
1156
|
+
setTenant({
|
|
1157
|
+
tenantId: id,
|
|
1158
|
+
name: row?.name ?? null,
|
|
1159
|
+
slug: row?.slug ?? null,
|
|
1160
|
+
logoUrl: row?.logo_url ?? null,
|
|
1161
|
+
primaryColor: row?.primary_color ?? null
|
|
1162
|
+
});
|
|
1163
|
+
}
|
|
1164
|
+
} catch {
|
|
1165
|
+
} finally {
|
|
1166
|
+
if (!cancelled) setResolving(false);
|
|
1167
|
+
}
|
|
1168
|
+
})();
|
|
1169
|
+
return () => {
|
|
1170
|
+
cancelled = true;
|
|
1171
|
+
};
|
|
1172
|
+
}, []);
|
|
1173
|
+
return { tenant, resolving };
|
|
1031
1174
|
}
|
|
1032
1175
|
function WorkspaceChooserGate({ fallback, children }) {
|
|
1033
1176
|
const tenant = useTenantOptional();
|
|
1177
|
+
const { tenant: byDomain, resolving: resolvingDomain } = useDomainTenant();
|
|
1178
|
+
const switchOrg = tenant?.switchOrg;
|
|
1179
|
+
const entering = React.useRef(false);
|
|
1180
|
+
React.useEffect(() => {
|
|
1181
|
+
if (!byDomain || !tenant?.orgsKnown || tenant.org || !switchOrg || entering.current) return;
|
|
1182
|
+
if (!tenant.userOrgs.some((m) => m.orgId === byDomain.tenantId)) return;
|
|
1183
|
+
entering.current = true;
|
|
1184
|
+
void switchOrg(byDomain.tenantId);
|
|
1185
|
+
}, [byDomain, tenant?.orgsKnown, tenant?.org, tenant?.userOrgs, switchOrg]);
|
|
1034
1186
|
if (!tenant) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
1035
1187
|
const { org, userOrgs, orgsKnown, settled } = tenant;
|
|
1036
1188
|
if (org) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
1037
1189
|
if (!settled) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
|
|
1038
1190
|
if (!orgsKnown || userOrgs.length <= 1) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
1191
|
+
if (resolvingDomain) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
|
|
1192
|
+
if (byDomain && userOrgs.some((m) => m.orgId === byDomain.tenantId)) return /* @__PURE__ */ jsx(Fragment, { children: fallback ?? null });
|
|
1039
1193
|
return /* @__PURE__ */ jsx(
|
|
1040
1194
|
WorkspaceChooser,
|
|
1041
1195
|
{
|
|
@@ -1050,6 +1204,10 @@ var useWorkspaceSwitchingStore = create((set) => ({
|
|
|
1050
1204
|
markWorkspaceSwitch(target.orgId);
|
|
1051
1205
|
persistOrgId(target.orgId);
|
|
1052
1206
|
clearOrgSnapshot();
|
|
1207
|
+
try {
|
|
1208
|
+
localStorage.removeItem("fayz:boot-theme");
|
|
1209
|
+
} catch {
|
|
1210
|
+
}
|
|
1053
1211
|
set({ target });
|
|
1054
1212
|
},
|
|
1055
1213
|
cancel: () => set({ target: null })
|
|
@@ -1061,7 +1219,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
|
|
|
1061
1219
|
const v = t(key);
|
|
1062
1220
|
return !v || v === key ? fallback : v;
|
|
1063
1221
|
};
|
|
1064
|
-
const steps =
|
|
1222
|
+
const steps = React.useMemo(
|
|
1065
1223
|
() => [
|
|
1066
1224
|
tr("organization.switching.step1", "Alterando organiza\xE7\xE3o"),
|
|
1067
1225
|
tr("organization.switching.step2", "Garantindo seguran\xE7a dos dados"),
|
|
@@ -1070,10 +1228,10 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
|
|
|
1070
1228
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1071
1229
|
[]
|
|
1072
1230
|
);
|
|
1073
|
-
const [step, setStep] =
|
|
1074
|
-
const doneRef =
|
|
1231
|
+
const [step, setStep] = React.useState(0);
|
|
1232
|
+
const doneRef = React.useRef(onDone);
|
|
1075
1233
|
doneRef.current = onDone;
|
|
1076
|
-
|
|
1234
|
+
React.useEffect(() => {
|
|
1077
1235
|
const id = window.setInterval(() => {
|
|
1078
1236
|
setStep((s) => {
|
|
1079
1237
|
if (s < steps.length - 1) return s + 1;
|
|
@@ -1100,7 +1258,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
|
|
|
1100
1258
|
className: "saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25"
|
|
1101
1259
|
}
|
|
1102
1260
|
),
|
|
1103
|
-
/* @__PURE__ */ jsx(
|
|
1261
|
+
/* @__PURE__ */ jsx(OrgMark, { name: orgName, logoUrl: orgLogoUrl, tone: "popover", className: "h-16 w-16 rounded-2xl shadow-sm" })
|
|
1104
1262
|
] }),
|
|
1105
1263
|
/* @__PURE__ */ jsx("p", { className: "mt-7 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground", children: tr("organization.switching.eyebrow", "Entrando em") }),
|
|
1106
1264
|
/* @__PURE__ */ jsx("h1", { className: "mt-1.5 text-pretty text-center text-3xl font-semibold leading-tight tracking-tight text-foreground sm:text-4xl", children: orgName }),
|
|
@@ -1119,7 +1277,7 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
|
|
|
1119
1277
|
/* @__PURE__ */ jsx(
|
|
1120
1278
|
"span",
|
|
1121
1279
|
{
|
|
1122
|
-
className: cn(
|
|
1280
|
+
className: cn$1(
|
|
1123
1281
|
"flex h-7 items-center text-base transition-colors duration-300 sm:text-lg",
|
|
1124
1282
|
// Only ever two states now — done, or happening. Nothing is
|
|
1125
1283
|
// on screen before its turn, so there is no "ahead" tone.
|
|
@@ -1137,20 +1295,6 @@ function WorkspaceSwitching({ orgName, orgLogoUrl, onDone }) {
|
|
|
1137
1295
|
}
|
|
1138
1296
|
);
|
|
1139
1297
|
}
|
|
1140
|
-
function WorkspaceMark2({ name, logoUrl }) {
|
|
1141
|
-
if (logoUrl) {
|
|
1142
|
-
return /* @__PURE__ */ jsx(
|
|
1143
|
-
"img",
|
|
1144
|
-
{
|
|
1145
|
-
src: logoUrl,
|
|
1146
|
-
alt: "",
|
|
1147
|
-
className: "relative h-16 w-16 rounded-2xl object-cover shadow-sm"
|
|
1148
|
-
}
|
|
1149
|
-
);
|
|
1150
|
-
}
|
|
1151
|
-
const initials = name.split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0]).join("").toUpperCase();
|
|
1152
|
-
return /* @__PURE__ */ jsx("span", { className: "relative flex h-16 w-16 items-center justify-center rounded-2xl bg-primary text-xl font-semibold text-primary-foreground shadow-sm", children: initials || /* @__PURE__ */ jsx(Building2, { className: "h-7 w-7" }) });
|
|
1153
|
-
}
|
|
1154
1298
|
function WorkspaceSwitchingHost() {
|
|
1155
1299
|
const target = useWorkspaceSwitchingStore((s) => s.target);
|
|
1156
1300
|
if (!target) return null;
|
|
@@ -1164,6 +1308,6 @@ function WorkspaceSwitchingHost() {
|
|
|
1164
1308
|
);
|
|
1165
1309
|
}
|
|
1166
1310
|
|
|
1167
|
-
export { WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, getFayzSupabaseClient, getFayzSupabaseClientOptional, resolveAppId, useWorkspaceSwitchingStore };
|
|
1168
|
-
//# sourceMappingURL=chunk-
|
|
1169
|
-
//# sourceMappingURL=chunk-
|
|
1311
|
+
export { OrgMark, WorkspaceChooser, WorkspaceChooserGate, WorkspaceSwitching, WorkspaceSwitchingHost, activePluginIds, createFayzSupabaseClient, createMockOrgAdapter, createSupabaseOrgAdapter, getFayzSupabaseClient, getFayzSupabaseClientOptional, getSupabaseClientOptional, hasPlugin, orgInitials, resolveAppId, searchWorkspaces, useAppConfigStore, useWorkspaceSwitchingStore };
|
|
1312
|
+
//# sourceMappingURL=chunk-XJB76FHA.js.map
|
|
1313
|
+
//# sourceMappingURL=chunk-XJB76FHA.js.map
|