Merge branch 'main' into furnisettingeditor-pr

This commit is contained in:
DuckieTM
2026-03-23 11:13:00 +01:00
committed by GitHub
50 changed files with 3327 additions and 4746 deletions
@@ -14,6 +14,7 @@ export const FurniEditorView: FC<{}> = () =>
{
const [ isVisible, setIsVisible ] = useState(false);
const [ activeTab, setActiveTab ] = useState(TAB_SEARCH);
const pendingEditRef = useRef(false);
const {
items, total, page, loading, error, clearError,
@@ -22,11 +23,22 @@ export const FurniEditorView: FC<{}> = () =>
searchItems, loadDetail, loadBySpriteId, updateItem, deleteItem, createItem, loadInteractions
} = useFurniEditor();
useEffect(() =>
{
if(selectedItem && pendingEditRef.current)
{
pendingEditRef.current = false;
setActiveTab(TAB_EDIT);
}
}, [ selectedItem ]);
useEffect(() =>
{
const linkTracker: ILinkEventTracker = {
linkReceived: (url: string) =>
{
if(!GetSessionDataManager().isModerator) return;
const parts = url.split('/');
if(parts.length < 2) return;
@@ -61,6 +73,8 @@ export const FurniEditorView: FC<{}> = () =>
{
const handler = (e: CustomEvent<{ spriteId: number }>) =>
{
if(!GetSessionDataManager().isModerator) return;
const { spriteId } = e.detail;
if(!spriteId || spriteId <= 0) return;
@@ -109,6 +123,9 @@ export const FurniEditorView: FC<{}> = () =>
<NitroCardTabsItemView isActive={ activeTab === TAB_EDIT } onClick={ () => selectedItem && setActiveTab(TAB_EDIT) }>
Edit
</NitroCardTabsItemView>
<NitroCardTabsItemView isActive={ activeTab === TAB_CREATE } onClick={ () => setActiveTab(TAB_CREATE) }>
Create
</NitroCardTabsItemView>
</NitroCardTabsView>
<NitroCardContentView>
{ error &&
@@ -39,6 +39,19 @@ export const FurniEditorCreateView: FC<FurniEditorCreateViewProps> = props =>
interactionType: '',
interactionModesCount: 1,
customparams: '',
description: '',
revision: 0,
category: '',
defaultdir: 0,
offerid: 0,
buyout: false,
rentofferid: 0,
rentbuyout: false,
bc: false,
excludeddynamic: false,
furniline: '',
environment: '',
rare: false,
});
useEffect(() =>
@@ -93,6 +106,10 @@ export const FurniEditorCreateView: FC<FurniEditorCreateViewProps> = props =>
<label className={ labelClass }>Public Name *</label>
<input className={ inputClass } value={ form.publicName } onChange={ e => setField('publicName', e.target.value) } placeholder="My Custom Furni" />
</div>
<div className="col-span-2">
<label className={ labelClass }>Description</label>
<textarea className={ inputClass } rows={ 2 } value={ form.description } onChange={ e => setField('description', e.target.value) } />
</div>
<div>
<label className={ labelClass }>Sprite ID</label>
<input type="number" className={ inputClass } value={ form.spriteId } onChange={ e => setField('spriteId', Number(e.target.value)) } />
@@ -125,6 +142,10 @@ export const FurniEditorCreateView: FC<FurniEditorCreateViewProps> = props =>
<label className={ labelClass }>Stack Height</label>
<input type="number" step="0.01" className={ inputClass } value={ form.stackHeight } onChange={ e => setField('stackHeight', Number(e.target.value)) } />
</div>
<div>
<label className={ labelClass }>Default Dir</label>
<input type="number" className={ inputClass } value={ form.defaultdir } onChange={ e => setField('defaultdir', Number(e.target.value)) } />
</div>
</div>
</div>
@@ -45,6 +45,19 @@ export const FurniEditorEditView: FC<FurniEditorEditViewProps> = props =>
interactionType: '',
interactionModesCount: 0,
customparams: '',
description: '',
revision: 0,
category: '',
defaultdir: 0,
offerid: 0,
buyout: false,
rentofferid: 0,
rentbuyout: false,
bc: false,
excludeddynamic: false,
furniline: '',
environment: '',
rare: false,
});
const [ confirmDelete, setConfirmDelete ] = useState(false);
@@ -72,6 +85,19 @@ export const FurniEditorEditView: FC<FurniEditorEditViewProps> = props =>
interactionType: item.interactionType || '',
interactionModesCount: item.interactionModesCount || 0,
customparams: item.customparams || '',
description: item.description || '',
revision: item.revision || 0,
category: item.category || '',
defaultdir: item.defaultdir || 0,
offerid: item.offerid || 0,
buyout: !!item.buyout,
rentofferid: item.rentofferid || 0,
rentbuyout: !!item.rentbuyout,
bc: !!item.bc,
excludeddynamic: !!item.excludeddynamic,
furniline: item.furniline || '',
environment: item.environment || '',
rare: !!item.rare,
});
setConfirmDelete(false);
@@ -180,6 +206,10 @@ export const FurniEditorEditView: FC<FurniEditorEditViewProps> = props =>
<label className={ lb }>Stack Height</label>
<input type="number" step="0.01" className={ ic } value={ form.stackHeight } onChange={ e => setField('stackHeight', Number(e.target.value)) } />
</div>
<div>
<label className={ labelClass }>Default Dir</label>
<input type="number" className={ inputClass } value={ form.defaultdir } onChange={ e => setField('defaultdir', Number(e.target.value)) } />
</div>
</div>
</div>